blob: c16baf1cb5a49d50275fedfb18607edb2e07f888 [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.
*/
package org.apache.ignite.binary;
import org.jetbrains.annotations.Nullable;
/**
* Binary object builder. Provides ability to build binary objects dynamically without having class definitions.
* <p>
* Here is an example of how a binary object can be built dynamically:
* <pre name=code class=java>
* BinaryObjectBuilder builder = Ignition.ignite().binary().builder("org.project.MyObject");
*
* builder.setField("fieldA", "A");
* builder.setField("fieldB", "B");
*
* BinaryObject binaryObj = builder.build();
* </pre>
*
* <p>
* Also builder can be initialized by existing binary object. This allows changing some fields without affecting
* other fields.
* <pre name=code class=java>
* BinaryObjectBuilder builder = Ignition.ignite().binary().builder(person);
*
* builder.setField("name", "John");
*
* person = builder.build();
* </pre>
* </p>
*
* If you need to modify nested binary object you can get an instance of a builder for nested binary object using
* {@link #getField(String)}, changes made on nested builder will affect parent object,
* for example:
*
* <pre name=code class=java>
* BinaryObjectBuilder personBuilder = grid.binary().createBuilder(personBinaryObj);
* BinaryObjectBuilder addressBuilder = personBuilder.getField("address");
*
* addressBuilder.setField("city", "New York");
*
* personBinaryObj = personBuilder.build();
*
* // Should be "New York".
* String city = personBinaryObj.getField("address").getField("city");
* </pre>
*
* <p>
* Make sure to set values for all the fields that an object from your domain model has.
* If you need to set null as a value use {@link #setField(String, Object, Class)} method directly specifying
* field's type.
* <p>
* If to follow this recommendation you'll reduce the size of internal metadata object that
* every binary object of a particular type has. Usually the metadata size grows because particular fields are not set
* to an instance of a binary object constructed with the builder. Every time when you construct an object
* setting only a subset of the fields the metadata object related to this type is expanded by the metadata
* processor which treats every new combination of the fields as the new version of the binary object.
*
* @see org.apache.ignite.IgniteBinary#builder(String)
* @see org.apache.ignite.IgniteBinary#builder(BinaryObject)
*/
public interface BinaryObjectBuilder {
/**
* Returns value assigned to the specified field.
* If the value is a binary object then an instance of {@code BinaryObjectBuilder} will be returned,
* which can be modified.
* <p>
* Collections and maps returned from this method are modifiable.
*
* @param <T> Type of the field value.
* @param name Field name.
* @return Field value.
*/
public <T> T getField(String name);
/**
* Sets field value.
*
* @param name Field name.
* @param val Field value (cannot be {@code null}).
* @return {@code this} for chaining.
* @see BinaryObject#type()
*/
public BinaryObjectBuilder setField(String name, Object val);
/**
* Sets field value with value type specification.
* <p>
* Field type is needed for proper metadata update.
*
* @param name Field name.
* @param val Field value.
* @param type Field type.
* @param <T> Type of the field value.
* @return {@code this} for chaining.
* @see BinaryObject#type()
*/
public <T> BinaryObjectBuilder setField(String name, @Nullable T val, Class<? super T> type);
/**
* Sets field value.
* <p>
* This method should be used if field is binary object.
*
* @param name Field name.
* @param builder Builder for object field.
* @return {@code this} for chaining.
*/
public BinaryObjectBuilder setField(String name, @Nullable BinaryObjectBuilder builder);
/**
* Removes field from this builder.
*
* @param fieldName Field name.
* @return {@code this} instance for chaining.
*/
public BinaryObjectBuilder removeField(String fieldName);
/**
* Builds binary object.
*
* @return Binary object.
* @throws BinaryObjectException In case of error.
*/
public BinaryObject build() throws BinaryObjectException;
}