/*
 * Copyright 2008-present MongoDB, 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 org.bson.codecs.pojo;

import org.bson.codecs.Codec;

import java.lang.annotation.Annotation;
import java.util.List;

import static java.lang.String.format;
import static java.util.Collections.emptyList;
import static java.util.Collections.unmodifiableList;
import static org.bson.assertions.Assertions.notNull;
import static org.bson.codecs.pojo.PojoBuilderHelper.stateNotNull;

A builder for programmatically creating PropertyModels.
Type parameters:
  • <T> – the type of the property
See Also:
Since:3.5
/** * A builder for programmatically creating {@code PropertyModels}. * * @param <T> the type of the property * @since 3.5 * @see PropertyModel */
public final class PropertyModelBuilder<T> { private String name; private String readName; private String writeName; private TypeData<T> typeData; private PropertySerialization<T> propertySerialization; private Codec<T> codec; private PropertyAccessor<T> propertyAccessor; private List<Annotation> readAnnotations = emptyList(); private List<Annotation> writeAnnotations = emptyList(); private Boolean discriminatorEnabled; private String error; PropertyModelBuilder() { }
Returns:the property name
/** * @return the property name */
public String getName() { return name; }
Returns:the name of the property to use as the key when deserializing the data from BSON.
/** * @return the name of the property to use as the key when deserializing the data from BSON. */
public String getReadName() { return readName; }
Sets the readName, the key for this property when deserializing the data from BSON.

Note: A null means this property will not used when deserializing.

Params:
  • readName – the name of the property to use as the key when deserializing the data from BSON.
Returns:this
/** * Sets the readName, the key for this property when deserializing the data from BSON. * * <p>Note: A null means this property will not used when deserializing.</p> * * @param readName the name of the property to use as the key when deserializing the data from BSON. * @return this */
public PropertyModelBuilder<T> readName(final String readName) { this.readName = readName; return this; }
Returns:the name of the property to use as the key when serializing the data into BSON.
/** * @return the name of the property to use as the key when serializing the data into BSON. */
public String getWriteName() { return writeName; }
Sets the writeName, the key for this property when serializing the data into BSON.

Note: A null means this property will not be serialized.

Params:
  • writeName – the name of the property to use as the key when serializing the data into BSON.
Returns:this
/** * Sets the writeName, the key for this property when serializing the data into BSON. * * <p>Note: A null means this property will not be serialized.</p> * * @param writeName the name of the property to use as the key when serializing the data into BSON. * @return this */
public PropertyModelBuilder<T> writeName(final String writeName) { this.writeName = writeName; return this; }
Sets a custom codec for the property
Params:
  • codec – the custom codec for the property
Returns:this
/** * Sets a custom codec for the property * * @param codec the custom codec for the property * @return this */
public PropertyModelBuilder<T> codec(final Codec<T> codec) { this.codec = codec; return this; }
Returns:the custom codec to use if set or null
/** * @return the custom codec to use if set or null */
Codec<T> getCodec() { return codec; }
Sets the PropertySerialization checker
Params:
  • propertySerialization – checks if a property should be serialized
Returns:this
/** * Sets the {@link PropertySerialization} checker * * @param propertySerialization checks if a property should be serialized * @return this */
public PropertyModelBuilder<T> propertySerialization(final PropertySerialization<T> propertySerialization) { this.propertySerialization = notNull("propertySerialization", propertySerialization); return this; }
Returns:the PropertySerialization checker
/** * @return the {@link PropertySerialization} checker */
public PropertySerialization<T> getPropertySerialization() { return propertySerialization; }
Returns the read annotations, to be applied when serializing to BSON
Returns:the read annotations
/** * Returns the read annotations, to be applied when serializing to BSON * * @return the read annotations */
public List<Annotation> getReadAnnotations() { return readAnnotations; }
Sets the read annotations, to be applied when serializing to BSON
Params:
  • annotations – the read annotations
Returns:this
/** * Sets the read annotations, to be applied when serializing to BSON * * @param annotations the read annotations * @return this */
public PropertyModelBuilder<T> readAnnotations(final List<Annotation> annotations) { this.readAnnotations = unmodifiableList(notNull("annotations", annotations)); return this; }
Returns the write annotations, to be applied when deserializing from BSON
Returns:the write annotations
/** * Returns the write annotations, to be applied when deserializing from BSON * * @return the write annotations */
public List<Annotation> getWriteAnnotations() { return writeAnnotations; }
Sets the writeAnnotations, to be applied when deserializing from BSON
Params:
  • writeAnnotations – the writeAnnotations
Returns:this
/** * Sets the writeAnnotations, to be applied when deserializing from BSON * * @param writeAnnotations the writeAnnotations * @return this */
public PropertyModelBuilder<T> writeAnnotations(final List<Annotation> writeAnnotations) { this.writeAnnotations = writeAnnotations; return this; }
Property is writable.
Returns:true if can be deserialized from BSON
/** * Property is writable. * * @return true if can be deserialized from BSON */
public boolean isWritable() { return writeName != null; }
Property is readable.
Returns:true if can be serialized to BSON
/** * Property is readable. * * @return true if can be serialized to BSON */
public boolean isReadable() { return readName != null; }
Returns:true or false if a discriminator should be used when serializing or null if not set
/** * @return true or false if a discriminator should be used when serializing or null if not set */
public Boolean isDiscriminatorEnabled() { return discriminatorEnabled; }
Enables or disables the use of a discriminator when serializing
Params:
  • discriminatorEnabled – the useDiscriminator value
Returns:this
/** * Enables or disables the use of a discriminator when serializing * * @param discriminatorEnabled the useDiscriminator value * @return this */
public PropertyModelBuilder<T> discriminatorEnabled(final boolean discriminatorEnabled) { this.discriminatorEnabled = discriminatorEnabled; return this; }
Returns the PropertyAccessor
Returns:the PropertyAccessor
/** * Returns the {@link PropertyAccessor} * * @return the PropertyAccessor */
public PropertyAccessor<T> getPropertyAccessor() { return propertyAccessor; }
Params:
  • propertyAccessor – the PropertyAccessor
Returns:this
/** * Sets the {@link PropertyAccessor} * * @param propertyAccessor the PropertyAccessor * @return this */
public PropertyModelBuilder<T> propertyAccessor(final PropertyAccessor<T> propertyAccessor) { this.propertyAccessor = propertyAccessor; return this; }
Creates the PropertyModel.
Returns:the PropertyModel
/** * Creates the {@link PropertyModel}. * * @return the PropertyModel */
@SuppressWarnings({"rawtypes", "unchecked"}) public PropertyModel<T> build() { if (!isReadable() && !isWritable()) { throw new IllegalStateException(format("Invalid PropertyModel '%s', neither readable or writable,", name)); } return new PropertyModel( stateNotNull("propertyName", name), readName, writeName, stateNotNull("typeData", typeData), codec, stateNotNull("propertySerialization", propertySerialization), discriminatorEnabled, stateNotNull("propertyAccessor", propertyAccessor), error); } @Override public String toString() { return format("PropertyModelBuilder{propertyName=%s, typeData=%s}", name, typeData); } PropertyModelBuilder<T> propertyName(final String propertyName) { this.name = notNull("propertyName", propertyName); return this; } TypeData<T> getTypeData() { return typeData; } PropertyModelBuilder<T> typeData(final TypeData<T> typeData) { this.typeData = notNull("typeData", typeData); return this; } PropertyModelBuilder<T> setError(final String error) { this.error = error; return this; } }