diff --git a/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryLegacyTypeHandlerSupplier.java b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryLegacyTypeHandlerSupplier.java new file mode 100644 index 00000000..9e5cf08c --- /dev/null +++ b/persistence/binary/src/main/java/org/eclipse/serializer/persistence/binary/types/BinaryLegacyTypeHandlerSupplier.java @@ -0,0 +1,22 @@ +package org.eclipse.serializer.persistence.binary.types; + +/*- + * #%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 org.eclipse.serializer.persistence.types.PersistenceLegacyTypeHandlerSupplier; + +public interface BinaryLegacyTypeHandlerSupplier extends PersistenceLegacyTypeHandlerSupplier +{ + +} diff --git a/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeHandlerSupplier.java b/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeHandlerSupplier.java new file mode 100644 index 00000000..9324490c --- /dev/null +++ b/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeHandlerSupplier.java @@ -0,0 +1,26 @@ +package org.eclipse.serializer.persistence.types; + +/*- + * #%L + * Eclipse Serializer Persistence + * %% + * 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% + */ + +/** + * Classes implementing this interface must supply a PersistenceLegacyTypeHandler + * + * @param Persitence implementation type + * @param Class<?> of the legacy type + */ +public interface PersistenceLegacyTypeHandlerSupplier +{ + PersistenceLegacyTypeHandler getLegacyTypeHandler(); +} diff --git a/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeMapper.java b/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeMapper.java index d1b67600..fe1cf37b 100644 --- a/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeMapper.java +++ b/persistence/persistence/src/main/java/org/eclipse/serializer/persistence/types/PersistenceLegacyTypeMapper.java @@ -338,6 +338,18 @@ private PersistenceLegacyTypeHandler lookupCustomHandlerByTypeId( return null; } + validateLegacyTypeHandler(type, legacyTypeDefinition, legacyTypeHandlerbyId); + + return legacyTypeHandlerbyId; + } + + + + private void validateLegacyTypeHandler( + final Class type, + final PersistenceTypeDefinition legacyTypeDefinition, + final PersistenceLegacyTypeHandler legacyTypeHandlerbyId) + { // validate if the found handler with matching explicit typeId also has matching type and structure if(type != null && type != legacyTypeDefinition.type() || !PersistenceTypeDescription.equalStructure(legacyTypeHandlerbyId, legacyTypeDefinition) @@ -347,8 +359,6 @@ private PersistenceLegacyTypeHandler lookupCustomHandlerByTypeId( "Type handler structure mismatch for " + legacyTypeDefinition.toTypeIdentifier() ); } - - return legacyTypeHandlerbyId; } private PersistenceLegacyTypeHandler lookupCustomHandlerByStructure( @@ -378,6 +388,16 @@ public PersistenceLegacyTypeHandler ensureLegacyTypeHandler( final PersistenceTypeHandler currentTypeHandler ) { + //check for supplied handler + if(currentTypeHandler instanceof PersistenceLegacyTypeHandlerSupplier supplier) + { + @SuppressWarnings("unchecked") + PersistenceLegacyTypeHandler legacyTypeHandler = supplier.getLegacyTypeHandler(); + validateLegacyTypeHandler(legacyTypeDefinition.type(), legacyTypeDefinition, legacyTypeHandler); + return legacyTypeHandler.initialize(legacyTypeDefinition.typeId()); + } + + // check for a custom handler with matching structure final PersistenceLegacyTypeHandler customHandler = this.lookupCustomHandler(legacyTypeDefinition); if(customHandler != null)