Repository: incubator-ignite Updated Branches: refs/heads/ignite-1258 [created] 9013e1e45
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableMarshalAware.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableMarshalAware.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableMarshalAware.java new file mode 100644 index 0000000..031dc59 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableMarshalAware.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +/** + * Interface that allows to implement custom serialization + * logic for portable objects. Portable objects are not required + * to implement this interface, in which case Ignite will automatically + * serialize portable objects using reflection. + * <p> + * This interface, in a way, is analogous to {@link java.io.Externalizable} + * interface, which allows users to override default serialization logic, + * usually for performance reasons. The only difference here is that portable + * serialization is already very fast and implementing custom serialization + * logic for portables does not provide significant performance gains. + */ +public interface PortableMarshalAware { + /** + * Writes fields to provided writer. + * + * @param writer Portable object writer. + * @throws PortableException In case of error. + */ + public void writePortable(PortableWriter writer) throws PortableException; + + /** + * Reads fields from provided reader. + * + * @param reader Portable object reader. + * @throws PortableException In case of error. + */ + public void readPortable(PortableReader reader) throws PortableException; +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableMetadata.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableMetadata.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableMetadata.java new file mode 100644 index 0000000..cb4943e --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableMetadata.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.util.*; + +/** + * Portable type meta data. Metadata for portable types can be accessed from any of the + * {@link GridPortables#metadata(String) GridPortables.metadata(...)} methods. + * Having metadata also allows for proper formatting of {@code GridPortableObject.toString()} method, + * even when portable objects are kept in binary format only, which may be necessary for audit reasons. + */ +public interface PortableMetadata { + /** + * Gets portable type name. + * + * @return Portable type name. + */ + public String typeName(); + + /** + * Gets collection of all field names for this portable type. + * + * @return Collection of all field names for this portable type. + */ + public Collection<String> fields(); + + /** + * Gets name of the field type for a given field. + * + * @param fieldName Field name. + * @return Field type name. + */ + @Nullable public String fieldTypeName(String fieldName); + + /** + * Portable objects can optionally specify custom key-affinity mapping in the + * configuration. This method returns the name of the field which should be + * used for the key-affinity mapping. + * + * @return Affinity key field name. + */ + @Nullable public String affinityKeyFieldName(); +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableObject.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableObject.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableObject.java new file mode 100644 index 0000000..080abfd --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableObject.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.io.*; +import java.util.*; + +/** + * Wrapper for portable object in portable binary format. Once an object is defined as portable, + * Ignite will always store it in memory in the portable (i.e. binary) format. + * User can choose to work either with the portable format or with the deserialized form + * (assuming that class definitions are present in the classpath). + * <p> + * <b>NOTE:</b> user does not need to (and should not) implement this interface directly. + * <p> + * To work with the portable format directly, user should create a cache projection + * over {@code GridPortableObject} class and then retrieve individual fields as needed: + * <pre name=code class=java> + * CacheProjection<GridPortableObject.class, GridPortableObject.class> prj = + * cache.projection(GridPortableObject.class, GridPortableObject.class); + * + * // Convert instance of MyKey to portable format. + * // We could also use GridPortableBuilder to create + * // the key in portable format directly. + * GridPortableObject key = grid.portables().toPortable(new MyKey()); + * + * GridPortableObject val = prj.get(key); + * + * String field = val.field("myFieldName"); + * </pre> + * Alternatively, we could also choose a hybrid approach, where, for example, + * the keys are concrete deserialized objects and the values are returned in portable + * format, like so: + * <pre name=code class=java> + * CacheProjection<MyKey.class, GridPortableObject.class> prj = + * cache.projection(MyKey.class, GridPortableObject.class); + * + * GridPortableObject val = prj.get(new MyKey()); + * + * String field = val.field("myFieldName"); + * </pre> + * We could also have the values as concrete deserialized objects and the keys in portable format, + * but such use case is a lot less common because cache keys are usually a lot smaller than values, and + * it may be very cheap to deserialize the keys, but not the values. + * <p> + * And finally, if we have class definitions in the classpath, we may choose to work with deserialized + * typed objects at all times. In this case we do incur the deserialization cost, however, + * Ignite will only deserialize on the first access and will cache the deserialized object, + * so it does not have to be deserialized again: + * <pre name=code class=java> + * CacheProjection<MyKey.class, MyValue.class> prj = + * cache.projection(MyKey.class, MyValue.class); + * + * MyValue val = prj.get(new MyKey()); + * + * // Normal java getter. + * String fieldVal = val.getMyFieldName(); + * </pre> + * <h1 class="header">Working With Maps and Collections</h1> + * All maps and collections in the portable objects are serialized automatically. When working + * with different platforms, e.g. C++ or .NET, Ignite will automatically pick the most + * adequate collection or map in either language. For example, {@link ArrayList} in Java will become + * {@code List} in C#, {@link LinkedList} in Java is {@link LinkedList} in C#, {@link HashMap} + * in Java is {@code Dictionary} in C#, and {@link TreeMap} in Java becomes {@code SortedDictionary} + * in C#, etc. + * <h1 class="header">Dynamic Structure Changes</h1> + * Since objects are always cached in the portable binary format, server does not need to + * be aware of the class definitions. Moreover, if class definitions are not present or not + * used on the server, then clients can continuously change the structure of the portable + * objects without having to restart the cluster. For example, if one client stores a + * certain class with fields A and B, and another client stores the same class with + * fields B and C, then the server-side portable object will have the fields A, B, and C. + * As the structure of a portable object changes, the new fields become available for SQL queries + * automatically. + * <h1 class="header">Building Portable Objects</h1> + * Ignite comes with {@link PortableBuilder} which allows to build portable objects dynamically: + * <pre name=code class=java> + * GridPortableBuilder builder = Ignition.ignite().portables().builder("org.project.MyObject"); + * + * builder.setField("fieldA", "A"); + * builder.setField("fieldB", "B"); + * + * GridPortableObject portableObj = builder.build(); + * </pre> + * For the cases when class definition is present + * in the class path, it is also possible to populate a standard POJO and then + * convert it to portable format, like so: + * <pre name=code class=java> + * MyObject obj = new MyObject(); + * + * obj.setFieldA("A"); + * obj.setFieldB(123); + * + * GridPortableObject portableObj = Ignition.ignite().portables().toPortable(obj); + * </pre> + * <h1 class="header">Portable Metadata</h1> + * Even though Ignite portable protocol only works with hash codes for type and field names + * to achieve better performance, Ignite provides metadata for all portable types which + * can be queried ar runtime via any of the {@link GridPortables#metadata(Class) GridPortables.metadata(...)} + * methods. Having metadata also allows for proper formatting of {@code GridPortableObject.toString()} method, + * even when portable objects are kept in binary format only, which may be necessary for audit reasons. + */ +public interface PortableObject extends Serializable, Cloneable { + /** + * Gets portable object type ID. + * + * @return Type ID. + */ + public int typeId(); + + /** + * Gets meta data for this portable object. + * + * @return Meta data. + * @throws PortableException In case of error. + */ + @Nullable public PortableMetadata metaData() throws PortableException; + + /** + * Gets field value. + * + * @param fieldName Field name. + * @return Field value. + * @throws PortableException In case of any other error. + */ + @Nullable public <F> F field(String fieldName) throws PortableException; + + /** + * Checks whether field is set. + * + * @param fieldName Field name. + * @return {@code true} if field is set. + */ + public boolean hasField(String fieldName); + + /** + * Gets fully deserialized instance of portable object. + * + * @return Fully deserialized instance of portable object. + * @throws PortableInvalidClassException If class doesn't exist. + * @throws PortableException In case of any other error. + */ + @Nullable public <T> T deserialize() throws PortableException; + + /** + * Copies this portable object. + * + * @return Copy of this portable object. + */ + public PortableObject clone() throws CloneNotSupportedException; +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableProtocolVersion.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableProtocolVersion.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableProtocolVersion.java new file mode 100644 index 0000000..1b30471 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableProtocolVersion.java @@ -0,0 +1,32 @@ +/* Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +/** + * Portable protocol version. + */ +public enum PortableProtocolVersion { + /** Ignite 1.4.0 release. */ + VER_1_4_0; + + /** Enumerated values. */ + private static final PortableProtocolVersion[] VALS = values(); + + /** + * Efficiently gets enumerated value from its ordinal. + * + * @param ord Ordinal value. + * @return Enumerated value or {@code null} if ordinal out of range. + */ + @Nullable public static PortableProtocolVersion fromOrdinal(int ord) { + return ord >= 0 && ord < VALS.length ? VALS[ord] : null; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java new file mode 100644 index 0000000..7bb6668 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawReader.java @@ -0,0 +1,241 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.Date; + +/** + * Raw reader for portable objects. Raw reader does not use field name hash codes, therefore, + * making the format even more compact. However, if the raw reader is used, + * dynamic structure changes to the portable objects are not supported. + */ +public interface PortableRawReader { + /** + * @return Byte value. + * @throws PortableException In case of error. + */ + public byte readByte() throws PortableException; + + /** + * @return Short value. + * @throws PortableException In case of error. + */ + public short readShort() throws PortableException; + + /** + * @return Integer value. + * @throws PortableException In case of error. + */ + public int readInt() throws PortableException; + + /** + * @return Long value. + * @throws PortableException In case of error. + */ + public long readLong() throws PortableException; + + /** + * @return Float value. + * @throws PortableException In case of error. + */ + public float readFloat() throws PortableException; + + /** + * @return Double value. + * @throws PortableException In case of error. + */ + public double readDouble() throws PortableException; + + /** + * @return Char value. + * @throws PortableException In case of error. + */ + public char readChar() throws PortableException; + + /** + * @return Boolean value. + * @throws PortableException In case of error. + */ + public boolean readBoolean() throws PortableException; + + /** + * @return Decimal value. + * @throws PortableException In case of error. + */ + @Nullable public BigDecimal readDecimal() throws PortableException; + + /** + * @return String value. + * @throws PortableException In case of error. + */ + @Nullable public String readString() throws PortableException; + + /** + * @return UUID. + * @throws PortableException In case of error. + */ + @Nullable public UUID readUuid() throws PortableException; + + /** + * @return Date. + * @throws PortableException In case of error. + */ + @Nullable public Date readDate() throws PortableException; + + /** + * @return Timestamp. + * @throws PortableException In case of error. + */ + @Nullable public Timestamp readTimestamp() throws PortableException; + + /** + * @return Object. + * @throws PortableException In case of error. + */ + @Nullable public <T> T readObject() throws PortableException; + + /** + * @return Byte array. + * @throws PortableException In case of error. + */ + @Nullable public byte[] readByteArray() throws PortableException; + + /** + * @return Short array. + * @throws PortableException In case of error. + */ + @Nullable public short[] readShortArray() throws PortableException; + + /** + * @return Integer array. + * @throws PortableException In case of error. + */ + @Nullable public int[] readIntArray() throws PortableException; + + /** + * @return Long array. + * @throws PortableException In case of error. + */ + @Nullable public long[] readLongArray() throws PortableException; + + /** + * @return Float array. + * @throws PortableException In case of error. + */ + @Nullable public float[] readFloatArray() throws PortableException; + + /** + * @return Byte array. + * @throws PortableException In case of error. + */ + @Nullable public double[] readDoubleArray() throws PortableException; + + /** + * @return Char array. + * @throws PortableException In case of error. + */ + @Nullable public char[] readCharArray() throws PortableException; + + /** + * @return Boolean array. + * @throws PortableException In case of error. + */ + @Nullable public boolean[] readBooleanArray() throws PortableException; + + /** + * @return Decimal array. + * @throws PortableException In case of error. + */ + @Nullable public BigDecimal[] readDecimalArray() throws PortableException; + + /** + * @return String array. + * @throws PortableException In case of error. + */ + @Nullable public String[] readStringArray() throws PortableException; + + /** + * @return UUID array. + * @throws PortableException In case of error. + */ + @Nullable public UUID[] readUuidArray() throws PortableException; + + /** + * @return Date array. + * @throws PortableException In case of error. + */ + @Nullable public Date[] readDateArray() throws PortableException; + + /** + * @return Object array. + * @throws PortableException In case of error. + */ + @Nullable public Object[] readObjectArray() throws PortableException; + + /** + * @return Collection. + * @throws PortableException In case of error. + */ + @Nullable public <T> Collection<T> readCollection() throws PortableException; + + /** + * @param colCls Collection class. + * @return Collection. + * @throws PortableException In case of error. + */ + @Nullable public <T> Collection<T> readCollection(Class<? extends Collection<T>> colCls) + throws PortableException; + + /** + * @return Map. + * @throws PortableException In case of error. + */ + @Nullable public <K, V> Map<K, V> readMap() throws PortableException; + + /** + * @param mapCls Map class. + * @return Map. + * @throws PortableException In case of error. + */ + @Nullable public <K, V> Map<K, V> readMap(Class<? extends Map<K, V>> mapCls) throws PortableException; + + /** + * @return Value. + * @throws PortableException In case of error. + */ + @Nullable public <T extends Enum<?>> T readEnum() throws PortableException; + + /** + * @return Value. + * @throws PortableException In case of error. + */ + @Nullable public <T extends Enum<?>> T[] readEnumArray() throws PortableException; + + /** + * @param enumCls Enum class. + * @return Value. + * @throws PortableException In case of error. + */ + @Deprecated + @Nullable public <T extends Enum<?>> T readEnum(Class<T> enumCls) throws PortableException; + + /** + * @param enumCls Enum class. + * @return Value. + * @throws PortableException In case of error. + */ + @Deprecated + @Nullable public <T extends Enum<?>> T[] readEnumArray(Class<T> enumCls) throws PortableException; +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java new file mode 100644 index 0000000..9dd74bc --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableRawWriter.java @@ -0,0 +1,210 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.Date; + +/** + * Raw writer for portable object. Raw writer does not write field name hash codes, therefore, + * making the format even more compact. However, if the raw writer is used, + * dynamic structure changes to the portable objects are not supported. + */ +public interface PortableRawWriter { + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeByte(byte val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeShort(short val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeInt(int val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeLong(long val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeFloat(float val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDouble(double val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeChar(char val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeBoolean(boolean val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDecimal(@Nullable BigDecimal val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeString(@Nullable String val) throws PortableException; + + /** + * @param val UUID to write. + * @throws PortableException In case of error. + */ + public void writeUuid(@Nullable UUID val) throws PortableException; + + /** + * @param val Date to write. + * @throws PortableException In case of error. + */ + public void writeDate(@Nullable Date val) throws PortableException; + + /** + * @param val Timestamp to write. + * @throws PortableException In case of error. + */ + public void writeTimestamp(@Nullable Timestamp val) throws PortableException; + + /** + * @param obj Value to write. + * @throws PortableException In case of error. + */ + public void writeObject(@Nullable Object obj) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeByteArray(@Nullable byte[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeShortArray(@Nullable short[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeIntArray(@Nullable int[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeLongArray(@Nullable long[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeFloatArray(@Nullable float[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDoubleArray(@Nullable double[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeCharArray(@Nullable char[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeBooleanArray(@Nullable boolean[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDecimalArray(@Nullable BigDecimal[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeStringArray(@Nullable String[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeUuidArray(@Nullable UUID[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDateArray(@Nullable Date[] val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeObjectArray(@Nullable Object[] val) throws PortableException; + + /** + * @param col Collection to write. + * @throws PortableException In case of error. + */ + public <T> void writeCollection(@Nullable Collection<T> col) throws PortableException; + + /** + * @param map Map to write. + * @throws PortableException In case of error. + */ + public <K, V> void writeMap(@Nullable Map<K, V> map) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public <T extends Enum<?>> void writeEnum(T val) throws PortableException; + + /** + * @param val Value to write. + * @throws PortableException In case of error. + */ + public <T extends Enum<?>> void writeEnumArray(T[] val) throws PortableException; +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java new file mode 100644 index 0000000..9104f8d --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableReader.java @@ -0,0 +1,294 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.Date; + +/** + * Reader for portable objects used in {@link PortableMarshalAware} implementations. + * Useful for the cases when user wants a fine-grained control over serialization. + * <p> + * Note that Ignite never writes full strings for field or type names. Instead, + * for performance reasons, Ignite writes integer hash codes for type and field names. + * It has been tested that hash code conflicts for the type names or the field names + * within the same type are virtually non-existent and, to gain performance, it is safe + * to work with hash codes. For the cases when hash codes for different types or fields + * actually do collide, Ignite provides {@link PortableIdMapper} which + * allows to override the automatically generated hash code IDs for the type and field names. + */ +public interface PortableReader { + /** + * @param fieldName Field name. + * @return Byte value. + * @throws PortableException In case of error. + */ + public byte readByte(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Short value. + * @throws PortableException In case of error. + */ + public short readShort(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Integer value. + * @throws PortableException In case of error. + */ + public int readInt(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Long value. + * @throws PortableException In case of error. + */ + public long readLong(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @throws PortableException In case of error. + * @return Float value. + */ + public float readFloat(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Double value. + * @throws PortableException In case of error. + */ + public double readDouble(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Char value. + * @throws PortableException In case of error. + */ + public char readChar(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Boolean value. + * @throws PortableException In case of error. + */ + public boolean readBoolean(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Decimal value. + * @throws PortableException In case of error. + */ + @Nullable public BigDecimal readDecimal(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return String value. + * @throws PortableException In case of error. + */ + @Nullable public String readString(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return UUID. + * @throws PortableException In case of error. + */ + @Nullable public UUID readUuid(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Date. + * @throws PortableException In case of error. + */ + @Nullable public Date readDate(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Timestamp. + * @throws PortableException In case of error. + */ + @Nullable public Timestamp readTimestamp(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Object. + * @throws PortableException In case of error. + */ + @Nullable public <T> T readObject(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Byte array. + * @throws PortableException In case of error. + */ + @Nullable public byte[] readByteArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Short array. + * @throws PortableException In case of error. + */ + @Nullable public short[] readShortArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Integer array. + * @throws PortableException In case of error. + */ + @Nullable public int[] readIntArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Long array. + * @throws PortableException In case of error. + */ + @Nullable public long[] readLongArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Float array. + * @throws PortableException In case of error. + */ + @Nullable public float[] readFloatArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Byte array. + * @throws PortableException In case of error. + */ + @Nullable public double[] readDoubleArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Char array. + * @throws PortableException In case of error. + */ + @Nullable public char[] readCharArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Boolean array. + * @throws PortableException In case of error. + */ + @Nullable public boolean[] readBooleanArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Decimal array. + * @throws PortableException In case of error. + */ + @Nullable public BigDecimal[] readDecimalArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return String array. + * @throws PortableException In case of error. + */ + @Nullable public String[] readStringArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return UUID array. + * @throws PortableException In case of error. + */ + @Nullable public UUID[] readUuidArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Date array. + * @throws PortableException In case of error. + */ + @Nullable public Date[] readDateArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Object array. + * @throws PortableException In case of error. + */ + @Nullable public Object[] readObjectArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Collection. + * @throws PortableException In case of error. + */ + @Nullable public <T> Collection<T> readCollection(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @param colCls Collection class. + * @return Collection. + * @throws PortableException In case of error. + */ + @Nullable public <T> Collection<T> readCollection(String fieldName, Class<? extends Collection<T>> colCls) + throws PortableException; + + /** + * @param fieldName Field name. + * @return Map. + * @throws PortableException In case of error. + */ + @Nullable public <K, V> Map<K, V> readMap(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @param mapCls Map class. + * @return Map. + * @throws PortableException In case of error. + */ + @Nullable public <K, V> Map<K, V> readMap(String fieldName, Class<? extends Map<K, V>> mapCls) + throws PortableException; + + /** + * @param fieldName Field name. + * @return Value. + * @throws PortableException In case of error. + */ + @Nullable public <T extends Enum<?>> T readEnum(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @return Value. + * @throws PortableException In case of error. + */ + @Nullable public <T extends Enum<?>> T[] readEnumArray(String fieldName) throws PortableException; + + /** + * @param fieldName Field name. + * @param enumCls Enum class. + * @return Value. + * @throws PortableException In case of error. + */ + @Deprecated + @Nullable public <T extends Enum<?>> T readEnum(String fieldName, Class<T> enumCls) throws PortableException; + + /** + * @param fieldName Field name. + * @param enumCls Enum class. + * @return Value. + * @throws PortableException In case of error. + */ + @Deprecated + @Nullable public <T extends Enum<?>> T[] readEnumArray(String fieldName, Class<T> enumCls) + throws PortableException; + + /** + * Gets raw reader. Raw reader does not use field name hash codes, therefore, + * making the format even more compact. However, if the raw reader is used, + * dynamic structure changes to the portable objects are not supported. + * + * @return Raw reader. + */ + public PortableRawReader rawReader(); +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableSerializer.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableSerializer.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableSerializer.java new file mode 100644 index 0000000..86e6a8b --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableSerializer.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +/** + * Interface that allows to implement custom serialization logic for portable objects. + * Can be used instead of {@link PortableMarshalAware} in case if the class + * cannot be changed directly. + * <p> + * Portable serializer can be configured for all portable objects via + * {@link PortableMarshaller#getSerializer()} method, or for a specific + * portable type via {@link PortableTypeConfiguration#getSerializer()} method. + */ +public interface PortableSerializer { + /** + * Writes fields to provided writer. + * + * @param obj Empty object. + * @param writer Portable object writer. + * @throws PortableException In case of error. + */ + public void writePortable(Object obj, PortableWriter writer) throws PortableException; + + /** + * Reads fields from provided reader. + * + * @param obj Empty object + * @param reader Portable object reader. + * @throws PortableException In case of error. + */ + public void readPortable(Object obj, PortableReader reader) throws PortableException; +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java new file mode 100644 index 0000000..81e9219 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableTypeConfiguration.java @@ -0,0 +1,189 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.apache.ignite.internal.util.typedef.internal.*; + +import java.sql.*; +import java.util.*; + +/** + * Defines configuration properties for a specific portable type. Providing per-type + * configuration is optional, as it is generally enough, and also optional, to provide global portable + * configuration using {@link org.gridgain.grid.marshaller.portable.PortableMarshaller#setClassNames(Collection)}. + * However, this class allows you to change configuration properties for a specific + * portable type without affecting configuration for other portable types. + * <p> + * Per-type portable configuration can be specified in + * {@link org.gridgain.grid.marshaller.portable.PortableMarshaller#getTypeConfigurations()} method. + */ +public class PortableTypeConfiguration { + /** Class name. */ + private String clsName; + + /** ID mapper. */ + private PortableIdMapper idMapper; + + /** Serializer. */ + private PortableSerializer serializer; + + /** Use timestamp flag. */ + private Boolean useTs; + + /** Meta data enabled flag. */ + private Boolean metaDataEnabled; + + /** Keep deserialized flag. */ + private Boolean keepDeserialized; + + /** Affinity key field name. */ + private String affKeyFieldName; + + /** + */ + public PortableTypeConfiguration() { + // No-op. + } + + /** + * @param clsName Class name. + */ + public PortableTypeConfiguration(String clsName) { + this.clsName = clsName; + } + + /** + * Gets type name. + * + * @return Type name. + */ + public String getClassName() { + return clsName; + } + + /** + * Sets type name. + * + * @param clsName Type name. + */ + public void setClassName(String clsName) { + this.clsName = clsName; + } + + /** + * Gets ID mapper. + * + * @return ID mapper. + */ + public PortableIdMapper getIdMapper() { + return idMapper; + } + + /** + * Sets ID mapper. + * + * @param idMapper ID mapper. + */ + public void setIdMapper(PortableIdMapper idMapper) { + this.idMapper = idMapper; + } + + /** + * Gets serializer. + * + * @return Serializer. + */ + public PortableSerializer getSerializer() { + return serializer; + } + + /** + * Sets serializer. + * + * @param serializer Serializer. + */ + public void setSerializer(PortableSerializer serializer) { + this.serializer = serializer; + } + + /** + * If {@code true} then date values converted to {@link Timestamp} during unmarshalling. + * + * @return Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. + */ + public Boolean isUseTimestamp() { + return useTs; + } + + /** + * @param useTs Flag indicating whether date values converted to {@link Timestamp} during unmarshalling. + */ + public void setUseTimestamp(Boolean useTs) { + this.useTs = useTs; + } + + /** + * Defines whether meta data is collected for this type. If provided, this value will override + * {@link org.gridgain.grid.marshaller.portable.PortableMarshaller#isMetaDataEnabled()} property. + * + * @return Whether meta data is collected. + */ + public Boolean isMetaDataEnabled() { + return metaDataEnabled; + } + + /** + * @param metaDataEnabled Whether meta data is collected. + */ + public void setMetaDataEnabled(Boolean metaDataEnabled) { + this.metaDataEnabled = metaDataEnabled; + } + + /** + * Defines whether {@link PortableObject} should cache deserialized instance. If provided, + * this value will override {@link org.gridgain.grid.marshaller.portable.PortableMarshaller#isKeepDeserialized()} + * property. + * + * @return Whether deserialized value is kept. + */ + public Boolean isKeepDeserialized() { + return keepDeserialized; + } + + /** + * @param keepDeserialized Whether deserialized value is kept. + */ + public void setKeepDeserialized(Boolean keepDeserialized) { + this.keepDeserialized = keepDeserialized; + } + + /** + * Gets affinity key field name. + * + * @return Affinity key field name. + */ + public String getAffinityKeyFieldName() { + return affKeyFieldName; + } + + /** + * Sets affinity key field name. + * + * @param affKeyFieldName Affinity key field name. + */ + public void setAffinityKeyFieldName(String affKeyFieldName) { + this.affKeyFieldName = affKeyFieldName; + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(PortableTypeConfiguration.class, this, super.toString()); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java b/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java new file mode 100644 index 0000000..c87dfd3 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/PortableWriter.java @@ -0,0 +1,257 @@ +/* + * Copyright (C) GridGain Systems. All Rights Reserved. + * _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.portable; + +import org.jetbrains.annotations.*; + +import java.math.*; +import java.sql.*; +import java.util.*; +import java.util.Date; + +/** + * Writer for portable object used in {@link PortableMarshalAware} implementations. + * Useful for the cases when user wants a fine-grained control over serialization. + * <p> + * Note that Ignite never writes full strings for field or type names. Instead, + * for performance reasons, Ignite writes integer hash codes for type and field names. + * It has been tested that hash code conflicts for the type names or the field names + * within the same type are virtually non-existent and, to gain performance, it is safe + * to work with hash codes. For the cases when hash codes for different types or fields + * actually do collide, Ignite provides {@link PortableIdMapper} which + * allows to override the automatically generated hash code IDs for the type and field names. + */ +public interface PortableWriter { + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeByte(String fieldName, byte val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeShort(String fieldName, short val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeInt(String fieldName, int val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeLong(String fieldName, long val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeFloat(String fieldName, float val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDouble(String fieldName, double val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeChar(String fieldName, char val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeBoolean(String fieldName, boolean val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDecimal(String fieldName, @Nullable BigDecimal val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeString(String fieldName, @Nullable String val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val UUID to write. + * @throws PortableException In case of error. + */ + public void writeUuid(String fieldName, @Nullable UUID val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Date to write. + * @throws PortableException In case of error. + */ + public void writeDate(String fieldName, @Nullable Date val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Timestamp to write. + * @throws PortableException In case of error. + */ + public void writeTimestamp(String fieldName, @Nullable Timestamp val) throws PortableException; + + /** + * @param fieldName Field name. + * @param obj Value to write. + * @throws PortableException In case of error. + */ + public void writeObject(String fieldName, @Nullable Object obj) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeByteArray(String fieldName, @Nullable byte[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeShortArray(String fieldName, @Nullable short[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeIntArray(String fieldName, @Nullable int[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeLongArray(String fieldName, @Nullable long[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeFloatArray(String fieldName, @Nullable float[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDoubleArray(String fieldName, @Nullable double[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeCharArray(String fieldName, @Nullable char[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeBooleanArray(String fieldName, @Nullable boolean[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDecimalArray(String fieldName, @Nullable BigDecimal[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeStringArray(String fieldName, @Nullable String[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeUuidArray(String fieldName, @Nullable UUID[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeDateArray(String fieldName, @Nullable Date[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public void writeObjectArray(String fieldName, @Nullable Object[] val) throws PortableException; + + /** + * @param fieldName Field name. + * @param col Collection to write. + * @throws PortableException In case of error. + */ + public <T> void writeCollection(String fieldName, @Nullable Collection<T> col) throws PortableException; + + /** + * @param fieldName Field name. + * @param map Map to write. + * @throws PortableException In case of error. + */ + public <K, V> void writeMap(String fieldName, @Nullable Map<K, V> map) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public <T extends Enum<?>> void writeEnum(String fieldName, T val) throws PortableException; + + /** + * @param fieldName Field name. + * @param val Value to write. + * @throws PortableException In case of error. + */ + public <T extends Enum<?>> void writeEnumArray(String fieldName, T[] val) throws PortableException; + + /** + * Gets raw writer. Raw writer does not write field name hash codes, therefore, + * making the format even more compact. However, if the raw writer is used, + * dynamic structure changes to the portable objects are not supported. + * + * @return Raw writer. + */ + public PortableRawWriter rawWriter(); +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1f2be19d/modules/core/src/main/java/org/apache/ignite/portable/package-info.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/portable/package-info.java b/modules/core/src/main/java/org/apache/ignite/portable/package-info.java new file mode 100644 index 0000000..0105b15 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/portable/package-info.java @@ -0,0 +1,22 @@ +/* + * 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 description. --> + * Contains portable objects API classes. + */ +package org.apache.ignite.portable; \ No newline at end of file