diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerLocalDate.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerLocalDate.java index c6223cd..c80da4c 100644 --- a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerLocalDate.java +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerLocalDate.java @@ -21,6 +21,14 @@ import org.eclipse.serializer.persistence.types.PersistenceLoadHandler; import org.eclipse.serializer.persistence.types.PersistenceStoreHandler; +/** + * Binary Handler for java.time.LocalDate + * Required for java ≥ 26 because of transient fields and + * changed binary format of YearMonth implementation. + * + * Binary Format must be compatibe with java < 26 versions! + * + */ public class BinaryHandlerLocalDate extends AbstractBinaryHandlerCustomNonReferentialFixedLength { static final long BINARY_OFFSET_YEAR = 0L; diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerMonthDay.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerMonthDay.java new file mode 100644 index 0000000..d1448b0 --- /dev/null +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerMonthDay.java @@ -0,0 +1,90 @@ +package org.eclipse.serializer.persistence.binary.java.time; + +/*- + * #%L + * Eclipse Serializer Persistence Binary + * %% + * Copyright (C) 2023 - 2026 MicroStream Software + * %% + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * #L% + */ + +import java.time.MonthDay; + +import org.eclipse.serializer.persistence.binary.types.AbstractBinaryHandlerCustomNonReferentialFixedLength; +import org.eclipse.serializer.persistence.binary.types.Binary; +import org.eclipse.serializer.persistence.types.PersistenceLoadHandler; +import org.eclipse.serializer.persistence.types.PersistenceStoreHandler; + +/** + * Binary Handler for java.time.MonthDay + * Required for java ≥ 26 because of transient fields and + * changed binary format of MonthDay implementation. + * + * Binary Format must be compatibe with java < 26 versions! + * + */ +public class BinaryHandlerMonthDay extends AbstractBinaryHandlerCustomNonReferentialFixedLength +{ + static final long BINARY_OFFSET_MONTH = 0L; + static final long BINARY_OFFSET_DAY = BINARY_OFFSET_MONTH + Integer.BYTES; + static final long BINARY_LENGTH = BINARY_OFFSET_DAY + Integer.BYTES; + + /////////////////////////////////////////////////////////////////////////// + // static methods // + /////////////////// + + public static BinaryHandlerMonthDay New() + { + return new BinaryHandlerMonthDay(); + } + + + /////////////////////////////////////////////////////////////////////////// + // constructors // + ///////////////// + + protected BinaryHandlerMonthDay() + { + super( + MonthDay.class, + CustomFields( + CustomField(int.class, "month" ), + CustomField(int.class, "day" ) + ) + ); + } + + /////////////////////////////////////////////////////////////////////////// + // methods // + //////////// + /// + @Override + public void updateState(final Binary data, final MonthDay instance, final PersistenceLoadHandler handler) + { + // no-op + } + + @Override + public void store(final Binary data, final MonthDay instance, final long objectId, final PersistenceStoreHandler handler) + { + data.storeEntityHeader(BINARY_LENGTH, this.typeId(), objectId); + + data.store_int (BINARY_OFFSET_MONTH , instance.getMonthValue()); + data.store_int (BINARY_OFFSET_DAY , instance.getDayOfMonth()); + } + + @Override + public MonthDay create(final Binary data, final PersistenceLoadHandler handler) + { + return MonthDay.of( + data.read_int (BINARY_OFFSET_MONTH), + data.read_int (BINARY_OFFSET_DAY)); + } + +} diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerYearMonth.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerYearMonth.java new file mode 100644 index 0000000..c5e587a --- /dev/null +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/java/time/BinaryHandlerYearMonth.java @@ -0,0 +1,90 @@ +package org.eclipse.serializer.persistence.binary.java.time; + +/*- + * #%L + * Eclipse Serializer Persistence Binary + * %% + * Copyright (C) 2023 - 2026 MicroStream Software + * %% + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * #L% + */ + +import java.time.YearMonth; + +import org.eclipse.serializer.persistence.binary.types.AbstractBinaryHandlerCustomNonReferentialFixedLength; +import org.eclipse.serializer.persistence.binary.types.Binary; +import org.eclipse.serializer.persistence.types.PersistenceLoadHandler; +import org.eclipse.serializer.persistence.types.PersistenceStoreHandler; + +/** + * Binary Handler for java.time.YearMonth + * Required for java ≥ 26 because of transient fields and + * changed binary format of YearMonth implementation. + * + * Binary Format must be compatibe with java < 26 versions! + * + */ +public class BinaryHandlerYearMonth extends AbstractBinaryHandlerCustomNonReferentialFixedLength +{ + static final long BINARY_OFFSET_YEAR = 0L; + static final long BINARY_OFFSET_MONTH = BINARY_OFFSET_YEAR + Integer.BYTES; + static final long BINARY_LENGTH = BINARY_OFFSET_MONTH + Integer.BYTES; + + /////////////////////////////////////////////////////////////////////////// + // static methods // + /////////////////// + + public static BinaryHandlerYearMonth New() + { + return new BinaryHandlerYearMonth(); + } + + + /////////////////////////////////////////////////////////////////////////// + // constructors // + ///////////////// + + protected BinaryHandlerYearMonth() + { + super( + YearMonth.class, + CustomFields( + CustomField(int.class, "year" ), + CustomField(int.class, "month" ) + ) + ); + } + + /////////////////////////////////////////////////////////////////////////// + // methods // + //////////// + /// + @Override + public void updateState(final Binary data, final YearMonth instance, final PersistenceLoadHandler handler) + { + // no-op + } + + @Override + public void store(final Binary data, final YearMonth instance, final long objectId, final PersistenceStoreHandler handler) + { + data.storeEntityHeader(BINARY_LENGTH, this.typeId(), objectId); + + data.store_int (BINARY_OFFSET_YEAR , instance.getYear()); + data.store_int (BINARY_OFFSET_MONTH , instance.getMonthValue()); + } + + @Override + public YearMonth create(final Binary data, final PersistenceLoadHandler handler) + { + return YearMonth.of( + data.read_int (BINARY_OFFSET_YEAR), + data.read_int (BINARY_OFFSET_MONTH)); + } + +} diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java index 0461c17..c0805ff 100644 --- a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryPersistence.java @@ -64,7 +64,9 @@ import org.eclipse.serializer.persistence.binary.java.sql.BinaryHandlerSqlTime; import org.eclipse.serializer.persistence.binary.java.sql.BinaryHandlerSqlTimestamp; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerLocalDate; +import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerMonthDay; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerPeriod; +import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerYearMonth; import org.eclipse.serializer.persistence.binary.java.time.BinaryHandlerZoneOffset; import org.eclipse.serializer.persistence.binary.java.util.BinaryHandlerArrayDeque; import org.eclipse.serializer.persistence.binary.java.util.BinaryHandlerArrayList; @@ -273,6 +275,8 @@ static final void initializeNativeTypeId( BinaryHandlerBitSet.New(), BinaryHandlerLocalDate.New(), + BinaryHandlerYearMonth.New(), + BinaryHandlerMonthDay.New(), /* (12.11.2019 TM)NOTE: * One might think that "empty" implementations of a collection interface would have no fields, anyway.