blob: b25e135554195c74d3a3c0fd4c56ffd39b01ce72 [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
#ifndef GEODE_PDXINSTANCEFACTORY_H_
#define GEODE_PDXINSTANCEFACTORY_H_
#include <map>
#include "CacheableBuiltins.hpp"
#include "CacheableDate.hpp"
#include "CacheableObjectArray.hpp"
#include "PdxInstance.hpp"
#include "internal/geode_globals.hpp"
namespace apache {
namespace geode {
namespace client {
class PdxType;
typedef std::map<std::string, std::shared_ptr<Cacheable>> FieldVsValues;
class CachePerfStats;
class PdxTypeRegistry;
class AuthenticatedView;
/**
* PdxInstanceFactory gives you a way to create PdxInstances.
* Call the write methods to populate the field data and then call {@link
* #create}
* to produce an actual instance that contains the data.
* To create a factory call {@link Cache#createPdxInstanceFactory}
* A factory can only create a single instance. To create multiple instances
* create
* multiple factories or use {@link PdxInstance#createWriter} to create
* subsequent instances.
*/
class APACHE_GEODE_EXPORT PdxInstanceFactory {
public:
PdxInstanceFactory() = delete;
~PdxInstanceFactory() noexcept = default;
PdxInstanceFactory(const PdxInstanceFactory& other) = default;
PdxInstanceFactory& operator=(const PdxInstanceFactory& other) = default;
PdxInstanceFactory(PdxInstanceFactory&& other) = default;
PdxInstanceFactory& operator=(PdxInstanceFactory&& other) = default;
public:
/**
* Create a {@link PdxInstance}. The instance
* will contain any data written to this factory
* using the write methods.
* @return the created Pdxinstance
* @throws IllegalStateException if called more than once
*/
std::shared_ptr<PdxInstance> create();
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char16_t</code>.
* <p>Java char is mapped to C++ char16_t.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeChar(const std::string& fieldName, char16_t value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char</code>.
* <p>Java char is mapped to C++ char.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeChar(const std::string& fieldName, char value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>bool</code>.
* <p>Java boolean is mapped to C++ bool.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeBoolean(const std::string& fieldName, bool value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int8_t</code>.
* <p>Java byte is mapped to C++ int8_t</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeByte(const std::string& fieldName, int8_t value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int16_t</code>.
* <p>Java short is mapped to C++ int16_t.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeShort(const std::string& fieldName, int16_t value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int32_t</code>.
* <p>Java int is mapped to C++ int32_t.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeInt(const std::string& fieldName, int32_t value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int64_t</code>.
* <p>Java long is mapped to C++ int64_t.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeLong(const std::string& fieldName, int64_t value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>float</code>.
* <p>Java float is mapped to C++ float.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeFloat(const std::string& fieldName, float value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>double</code>.
* <p>Java double is mapped to C++ double.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeDouble(const std::string& fieldName, double value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>CacheableDatePtr</code>.
* <p>Java Date is mapped to C++ std::shared_ptr<CacheableDate>.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeDate(const std::string& fieldName,
std::shared_ptr<CacheableDate> value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>std::string</code>.
* <p>Java String is mapped to C++ std::string.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeString(const std::string& fieldName,
const std::string& value);
PdxInstanceFactory& writeString(const std::string& fieldName,
std::string&& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>CacheablePtr</code>.
* <p>Java object is mapped to C++ std::shared_ptr<Cacheable>.</p>
* It is best to use one of the other writeXXX methods if your field type
* will always be XXX. This method allows the field value to be anything
* that is an instance of Object. This gives you more flexibility but more
* space is used to store the serialized field.
*
* Note that some Java objects serialized with this method may not be
* compatible with non-java languages.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeObject(const std::string& fieldName,
std::shared_ptr<Cacheable> value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>bool*</code>.
* <p>Java boolean[] is mapped to C++ bool*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeBooleanArray(const std::string& fieldName,
const std::vector<bool>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char16_t*</code>.
* <p>Java char[] is mapped to C++ char16_t*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeCharArray(const std::string& fieldName,
const std::vector<char16_t>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int8_t*</code>.
* <p>Java byte[] is mapped to C++ int8_t*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeByteArray(const std::string& fieldName,
const std::vector<int8_t>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int16_t*</code>.
* <p>Java short[] is mapped to C++ int16_t*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeShortArray(const std::string& fieldName,
const std::vector<int16_t>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int32_t*</code>.
* <p>Java int[] is mapped to C++ int32_t*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeIntArray(const std::string& fieldName,
const std::vector<int32_t>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int64_t*</code>.
* <p>Java long[] is mapped to C++ int64_t*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeLongArray(const std::string& fieldName,
const std::vector<int64_t>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>float*</code>.
* <p>Java float[] is mapped to C++ float*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeFloatArray(const std::string& fieldName,
const std::vector<float>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>double*</code>.
* <p>Java double[] is mapped to C++ double*.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeDoubleArray(const std::string& fieldName,
const std::vector<double>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>char**</code>.
* <p>Java String[] is mapped to C++ char**.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param length the length of the array field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeStringArray(const std::string& fieldName,
const std::vector<std::string>& value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>CacheableObjectArrayPtr</code>.
* Java Object[] is mapped to C++ std::shared_ptr<CacheableObjectArray>.
* For how each element of the array is a mapped to C++ see {@link
* #writeObject}.
* Note that this call may serialize elements that are not compatible with
* non-java languages.
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeObjectArray(
const std::string& fieldName,
std::shared_ptr<CacheableObjectArray> value);
/**
* Writes the named field with the given value to the serialized form.
* The fields type is <code>int8_t**</code>.
* <p>Java byte[][] is mapped to C++ int8_t**.</p>
* @param fieldName the name of the field to write
* @param value the value of the field to write
* @param arrayLength the length of the actual byte array field holding
* individual byte arrays to write
* @param elementLength the length of the individual byte arrays to write
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field has already been written
* or fieldName is nullptr or empty.
*/
PdxInstanceFactory& writeArrayOfByteArrays(const std::string& fieldName,
int8_t** value,
int32_t arrayLength,
int32_t* elementLength);
/**
* Indicate that the named field should be included in hashCode and equals
* (operator==()) checks
* of this object on a server that is accessing {@link PdxInstance}
* or when a client executes a query on a server.
*
* The fields that are marked as identity fields are used to generate the
* hashCode and
* equals (operator==()) methods of {@link PdxInstance}. Because of this, the
* identity fields should themselves
* either be primitives, or implement hashCode and equals (operator==()).
*
* If no fields are set as identity fields, then all fields will be used in
* hashCode and equals (operator==())
* checks.
*
* The identity fields should make marked after they are written using a
* write* method.
*
* @param fieldName the name of the field to mark as an identity field.
* @return this PdxInstanceFactory
* @throws IllegalStateException if the named field does not exist.
*/
PdxInstanceFactory& markIdentityField(const std::string& fieldName);
private:
bool m_created;
std::shared_ptr<PdxType> m_pdxType;
FieldVsValues m_FieldVsValues;
CachePerfStats& m_cachePerfStats;
PdxTypeRegistry& m_pdxTypeRegistry;
const CacheImpl& m_cacheImpl;
bool m_enableTimeStatistics;
void isFieldAdded(const std::string& fieldName);
PdxInstanceFactory(const std::string& className,
CachePerfStats& cachePerfStats,
PdxTypeRegistry& m_pdxTypeRegistry, const CacheImpl& cache,
bool enableTimeStatistics);
friend CacheImpl;
friend AuthenticatedView;
};
} // namespace client
} // namespace geode
} // namespace apache
#endif // GEODE_PDXINSTANCEFACTORY_H_