You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/11/08 11:56:07 UTC

[isis] branch master updated: ISIS-2453: removes TypeManagerImpl-Patch (as DN-core 5.2.5 is available)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 496261c  ISIS-2453: removes TypeManagerImpl-Patch (as DN-core 5.2.5 is available)
496261c is described below

commit 496261c267af8e91fdc6b040c38350532f173121
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Nov 8 12:55:39 2020 +0100

    ISIS-2453: removes TypeManagerImpl-Patch (as DN-core 5.2.5 is available)
---
 .../DataNucleusApplicationComponents5.java         |    5 +-
 .../datanucleus5/persistence/TypeManagerImpl2.java | 1539 --------------------
 .../persistence/_DNTypeManagerPatch.java           |   79 -
 3 files changed, 3 insertions(+), 1620 deletions(-)

diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/DataNucleusApplicationComponents5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/DataNucleusApplicationComponents5.java
index 82647e4..14248ce 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/DataNucleusApplicationComponents5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/DataNucleusApplicationComponents5.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.enterprise.inject.Vetoed;
+import javax.jdo.JDOHelper;
 import javax.jdo.JDOUserException;
 import javax.jdo.PersistenceManagerFactory;
 
@@ -40,6 +41,7 @@ import org.apache.isis.commons.internal.factory._InstanceUtil;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.context.IsisContext;
 import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.DataNucleusLifeCycleHelper;
 import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.DataNucleusPropertiesAware;
 import org.apache.isis.persistence.jdo.datanucleus5.metamodel.facets.object.query.JdoNamedQuery;
@@ -92,8 +94,7 @@ public class DataNucleusApplicationComponents5 {
             // this is where DN will throw an exception if we pass it any config props it doesn't like the look of.
             // we want to fail, but let's make sure that the error is visible to help the developer
             
-            return _DNTypeManagerPatch.newPersistenceManagerFactory(datanucleusProps);
-            //return JDOHelper.getPersistenceManagerFactory(datanucleusProps, IsisContext.getClassLoader());
+            return JDOHelper.getPersistenceManagerFactory(datanucleusProps, IsisContext.getClassLoader());
         } catch(JDOUserException ex) {
             log.fatal(ex);
             throw ex;
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/TypeManagerImpl2.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/TypeManagerImpl2.java
deleted file mode 100644
index 2fc95b2..0000000
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/TypeManagerImpl2.java
+++ /dev/null
@@ -1,1539 +0,0 @@
-/*
- *  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.isis.persistence.jdo.datanucleus5.persistence;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.MonthDay;
-import java.time.OffsetDateTime;
-import java.time.OffsetTime;
-import java.time.Period;
-import java.time.Year;
-import java.time.YearMonth;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Currency;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Optional;
-import java.util.PriorityQueue;
-import java.util.Properties;
-import java.util.Queue;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.SortedSet;
-import java.util.Stack;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.UUID;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.datanucleus.ClassLoaderResolver;
-import org.datanucleus.NucleusContext;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.exceptions.ClassNotResolvedException;
-import org.datanucleus.exceptions.NucleusException;
-import org.datanucleus.exceptions.NucleusUserException;
-import org.datanucleus.identity.IdentityUtils;
-import org.datanucleus.metadata.AbstractMemberMetaData;
-import org.datanucleus.plugin.ConfigurationElement;
-import org.datanucleus.plugin.PluginManager;
-import org.datanucleus.state.ObjectProvider;
-import org.datanucleus.store.StoreManager;
-import org.datanucleus.store.types.ContainerAdapter;
-import org.datanucleus.store.types.ContainerHandler;
-import org.datanucleus.store.types.SCO;
-import org.datanucleus.store.types.TypeManager;
-import org.datanucleus.store.types.containers.ArrayHandler;
-import org.datanucleus.store.types.containers.ArrayListHandler;
-import org.datanucleus.store.types.containers.HashMapHandler;
-import org.datanucleus.store.types.containers.HashSetHandler;
-import org.datanucleus.store.types.containers.HashtableHandler;
-import org.datanucleus.store.types.containers.JDKCollectionHandler;
-import org.datanucleus.store.types.containers.LinkedHashMapHandler;
-import org.datanucleus.store.types.containers.LinkedHashSetHandler;
-import org.datanucleus.store.types.containers.LinkedListHandler;
-import org.datanucleus.store.types.containers.OptionalHandler;
-import org.datanucleus.store.types.containers.PriorityQueueHandler;
-import org.datanucleus.store.types.containers.PropertiesHandler;
-import org.datanucleus.store.types.containers.StackHandler;
-import org.datanucleus.store.types.containers.TreeMapHandler;
-import org.datanucleus.store.types.containers.TreeSetHandler;
-import org.datanucleus.store.types.containers.VectorHandler;
-import org.datanucleus.store.types.converters.ClassStringConverter;
-import org.datanucleus.store.types.converters.TypeConverter;
-import org.datanucleus.util.ClassUtils;
-import org.datanucleus.util.Localiser;
-import org.datanucleus.util.NucleusLogger;
-import org.datanucleus.util.StringUtils;
-
-/**
- * TODO remove once fixed upstream!
- * <p>
- * Patched from DN original in support of priority based type registration.
- * While documented, was never implemented.
- * <p>
- * See also
- * https://github.com/datanucleus/datanucleus-core/pull/360
- */
-@Deprecated
-public class TypeManagerImpl2 implements TypeManager, Serializable
-{
-    private static final long serialVersionUID = 8217508318434539002L;
-
-    protected NucleusContext nucCtx;
-
-    protected transient ClassLoaderResolver clr;
-
-    /** Map of java types, keyed by the class name. */
-    protected Map<String, JavaType> javaTypes = new ConcurrentHashMap<>();
-    
-    /** Map of ContainerHandlers, keyed by the container type class name. */
-    protected Map<Class, ? super ContainerHandler> containerHandlersByClass = new ConcurrentHashMap<>();
-
-    /** Map of TypeConverter keyed by their symbolic name. */
-    protected Map<String, TypeConverter> typeConverterByName = new ConcurrentHashMap<>();
-
-    /** Map of TypeConverter keyed by type name that we should default to for this type (user-defined). */
-    protected Map<String, TypeConverter> autoApplyConvertersByType = null;
-
-    /** Map of (Map of TypeConverter keyed by the datastore type), keyed by the member type. */
-    protected Map<Class, Map<Class, TypeConverter>> typeConverterMap = new ConcurrentHashMap<>();
-
-    /** Cache of TypeConverter datastore type, keyed by the converter. */
-    protected Map<TypeConverter, Class> typeConverterDatastoreTypeByConverter = new ConcurrentHashMap<>();
-
-    /** Cache of TypeConverter member type, keyed by the converter. */
-    protected Map<TypeConverter, Class> typeConverterMemberTypeByConverter = new ConcurrentHashMap<>();
-
-    /**
-     * Constructor, loading support for type mappings using the plugin mechanism.
-     * @param nucCtx NucleusContext
-     */
-    public TypeManagerImpl2(NucleusContext nucCtx)
-    {
-        this.nucCtx = nucCtx;
-        this.clr = nucCtx.getClassLoaderResolver(null);
-        loadJavaTypes(nucCtx.getPluginManager());
-
-        // Load converters since if a type is otherwise not persistable but a converter is found, then the type becomes persistable, hence needs enhancing
-        loadTypeConverters(nucCtx.getPluginManager());
-    }
-
-    public void close()
-    {
-        containerHandlersByClass = null;
-        javaTypes = null;
-
-        typeConverterByName.clear();
-        typeConverterMap.clear();
-        typeConverterMemberTypeByConverter.clear();
-        typeConverterDatastoreTypeByConverter.clear();
-
-        autoApplyConvertersByType = null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getSupportedSecondClassTypes()
-     */
-    @Override
-    public Set<String> getSupportedSecondClassTypes()
-    {
-        return new HashSet(javaTypes.keySet());
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isSupportedSecondClassType(java.lang.String)
-     */
-    @Override
-    public boolean isSupportedSecondClassType(String className)
-    {
-        if (className == null)
-        {
-            return false;
-        }
-
-        JavaType type = javaTypes.get(className);
-        if (type == null)
-        {
-            try
-            {
-                Class cls = clr.classForName(className);
-                type = findJavaTypeForClass(cls);
-                return type != null;
-            }
-            catch (Exception e)
-            {
-            }
-            return false;
-        }
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#filterOutSupportedSecondClassNames(java.lang.String[])
-     */
-    @Override
-    public String[] filterOutSupportedSecondClassNames(String[] inputClassNames)
-    {
-        // Filter out any "simple" type classes
-        int filteredClasses = 0;
-        for (int i = 0; i < inputClassNames.length; ++i)
-        {
-            if (isSupportedSecondClassType(inputClassNames[i]))
-            {
-                inputClassNames[i] = null;
-                ++filteredClasses;
-            }
-        }
-        if (filteredClasses == 0)
-        {
-            return inputClassNames;
-        }
-        String[] restClasses = new String[inputClassNames.length - filteredClasses];
-        int m = 0;
-        for (int i = 0; i < inputClassNames.length; ++i)
-        {
-            if (inputClassNames[i] != null)
-            {
-                restClasses[m++] = inputClassNames[i];
-            }
-        }
-        return restClasses;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isDefaultPersistent(java.lang.Class)
-     */
-    @Override
-    public boolean isDefaultPersistent(Class c)
-    {
-        if (c == null)
-        {
-            return false;
-        }
-
-        JavaType type = javaTypes.get(c.getName());
-        if (type != null)
-        {
-            return true;
-        }
-
-        // Try to find a class that this class extends that is supported
-        type = findJavaTypeForClass(c);
-        if (type != null)
-        {
-            return true;
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isDefaultFetchGroup(java.lang.Class)
-     */
-    @Override
-    public boolean isDefaultFetchGroup(Class c)
-    {
-        if (c == null)
-        {
-            return false;
-        }
-
-        if (nucCtx.getApiAdapter().isPersistable(c))
-        {
-            // 1-1/N-1 (persistable field), so return what the API default is
-            return nucCtx.getApiAdapter().getDefaultDFGForPersistableField();
-        }
-
-        JavaType type = javaTypes.get(c.getName());
-        if (type != null)
-        {
-            // Field type defined in plugins, so return the setting
-            return type.dfg;
-        }
-
-        // Try to find a class that this class extends that is supported
-        type = findJavaTypeForClass(c);
-        if (type != null)
-        {
-            return type.dfg;
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isDefaultFetchGroupForCollection(java.lang.Class, java.lang.Class)
-     */
-    @Override
-    public boolean isDefaultFetchGroupForCollection(Class c, Class genericType)
-    {
-        if (c != null && genericType == null)
-        {
-            return isDefaultFetchGroup(c);
-        }
-        else if (c == null)
-        {
-            return false;
-        }
-
-        String name = c.getName() + "<" + genericType.getName() + ">";
-        JavaType type = javaTypes.get(name);
-        if (type != null)
-        {
-            return type.dfg;
-        }
-
-        // Try to find a class that this class extends that is supported
-        type = findJavaTypeForCollectionClass(c, genericType);
-        if (type != null)
-        {
-            return type.dfg;
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isDefaultEmbeddedType(java.lang.Class)
-     */
-    @Override
-    public boolean isDefaultEmbeddedType(Class c)
-    {
-        if (c == null)
-        {
-            return false;
-        }
-
-        JavaType type = javaTypes.get(c.getName());
-        if (type != null)
-        {
-            return type.embedded;
-        }
-
-        // Try to find a class that this class extends that is supported
-        type = findJavaTypeForClass(c);
-        if (type != null)
-        {
-            return type.embedded;
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isSecondClassMutableType(java.lang.String)
-     */
-    @Override
-    public boolean isSecondClassMutableType(String className)
-    {
-        return getWrapperTypeForType(className) != null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getWrapperTypeForType(java.lang.String)
-     */
-    @Override
-    public Class getWrapperTypeForType(String className)
-    {
-        if (className == null)
-        {
-            return null;
-        }
-
-        JavaType type = javaTypes.get(className);
-        return type == null ? null : type.wrapperType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getWrappedTypeBackedForType(java.lang.String)
-     */
-    @Override
-    public Class getWrappedTypeBackedForType(String className)
-    {
-        if (className == null)
-        {
-            return null;
-        }
-
-        JavaType type = javaTypes.get(className);
-        return type == null ? null : type.wrapperTypeBacked;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#isSecondClassWrapper(java.lang.String)
-     */
-    @Override
-    public boolean isSecondClassWrapper(String className)
-    {
-        if (className == null)
-        {
-            return false;
-        }
-
-        // Check java types with wrappers
-        Iterator iter = javaTypes.values().iterator();
-        while (iter.hasNext())
-        {
-            JavaType type = (JavaType)iter.next();
-            if (type.wrapperType != null && type.wrapperType.getName().equals(className))
-            {
-                return true;
-            }
-            if (type.wrapperTypeBacked != null && type.wrapperTypeBacked.getName().equals(className))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#createSCOInstance(org.datanucleus.state.ObjectProvider, org.datanucleus.metadata.AbstractMemberMetaData, java.lang.Class, java.lang.Object, boolean)
-     */
-    @Override
-    public SCO createSCOInstance(ObjectProvider ownerOP, AbstractMemberMetaData mmd, Class instantiatedType, Object value, boolean replaceField)
-    {
-        if (value != null && value instanceof SCO)
-        {
-            // Passed in value is a wrapper type already, so just return it!
-            if (replaceField)
-            {
-                // Replace the field with this value
-                ownerOP.replaceField(mmd.getAbsoluteFieldNumber(), value);
-            }
-            return (SCO) value;
-        }
-
-        // Create new wrapper of the required type
-        Class requiredType = value != null ? value.getClass() : instantiatedType; // Default to instantiated type
-        if ("declared".equalsIgnoreCase(nucCtx.getConfiguration().getStringProperty(PropertyNames.PROPERTY_TYPE_WRAPPER_BASIS)))
-        {
-            // Use declared type of the field to define the wrapper type
-            requiredType = mmd.getType();
-        }
-        SCO sco = createSCOInstance(ownerOP, mmd, requiredType);
-
-        if (replaceField)
-        {
-            // Replace the field in the owner with the wrapper before initialising it
-            ownerOP.replaceField(mmd.getAbsoluteFieldNumber(), sco);
-        }
-
-        // Initialise the SCO for use
-        if (value != null)
-        {
-            // Apply the existing value
-            sco.initialise(value);
-        }
-        else
-        {
-            // Just create it empty and load from the datastore
-            sco.initialise();
-        }
-
-        return sco;
-    }
-
-    /**
-     * Method to create a new SCO wrapper for the specified field replacing the old value with the new value. 
-     * If the member value is a SCO already will just return the (new) value.
-     * @param ownerOP The ObjectProvider of the owner object
-     * @param memberNumber The member number in the owner
-     * @param newValue The value to initialise the wrapper with (if any) for this member
-     * @param oldValue The previous value that we are replacing with this value
-     * @param replaceFieldIfChanged Whether to replace the member in the object if wrapping the value
-     * @return The wrapper (or original value if not wrappable)
-     */
-    public Object wrapAndReplaceSCOField(ObjectProvider ownerOP, int memberNumber, Object newValue, Object oldValue, boolean replaceFieldIfChanged)
-    {
-        if (newValue == null || !ownerOP.getClassMetaData().getSCOMutableMemberFlags()[memberNumber])
-        {
-            // We don't wrap null objects currently
-            return newValue;
-        }
-
-        if (!(newValue instanceof SCO) || ownerOP.getObject() != ((SCO)newValue).getOwner())
-        {
-            // Not a SCO wrapper, or is a SCO wrapper but not owned by this object
-            AbstractMemberMetaData mmd = ownerOP.getClassMetaData().getMetaDataForManagedMemberAtAbsolutePosition(memberNumber);
-            if (replaceFieldIfChanged)
-            {
-                if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-                {
-                    NucleusLogger.PERSISTENCE.debug(Localiser.msg("026029", StringUtils.toJVMIDString(ownerOP.getObject()), 
-                        ownerOP.getExecutionContext() != null ? IdentityUtils.getPersistableIdentityForId(ownerOP.getInternalObjectId()) : ownerOP.getInternalObjectId(), mmd.getName()));
-                }
-            }
-
-            if (newValue instanceof SCO)
-            {
-                // Passed in value is a wrapper type already, so just return it!
-                if (replaceFieldIfChanged)
-                {
-                    // Replace the field with this value
-                    ownerOP.replaceField(mmd.getAbsoluteFieldNumber(), newValue);
-                }
-                return newValue;
-            }
-
-            // Create new wrapper of the required type
-            Class requiredType = newValue.getClass();
-            SCO sco = createSCOInstance(ownerOP, mmd, requiredType);
-
-            if (replaceFieldIfChanged)
-            {
-                // Replace the field in the owner with the wrapper before initialising it
-                ownerOP.replaceField(mmd.getAbsoluteFieldNumber(), sco);
-            }
-
-            // Initialise the SCO for use, providing new and old values so the wrapper has the ability to do something intelligent
-            sco.initialise(newValue, oldValue);
-
-            return sco;
-        }
-        return newValue;
-    }
-
-    /**
-     * Method to create a new SCO wrapper for member type.
-     * Will find a wrapper suitable for the instantiated type (if provided), otherwise suitable for the member metadata type.
-     * @param ownerOP ObjectProvider for the owning object
-     * @param mmd The MetaData for the related member.
-     * @param instantiatedType Type to instantiate the member as (if known), otherwise falls back to the type from metadata
-     * @return The wrapper object of the required type
-     * @throws NucleusUserException if an error occurred when creating the SCO instance
-     */
-    private SCO createSCOInstance(ObjectProvider ownerOP, AbstractMemberMetaData mmd, Class instantiatedType)
-    {
-        String typeName = (instantiatedType != null) ? instantiatedType.getName() : mmd.getTypeName();
-
-        // Find the SCO wrapper type most suitable
-        StoreManager storeMgr = ownerOP.getExecutionContext().getStoreManager();
-        boolean backedWrapper = storeMgr.useBackedSCOWrapperForMember(mmd, ownerOP.getExecutionContext());
-        Class wrapperType = null;
-        if (mmd.isSerialized())
-        {
-            // If we have all elements serialised into a column then cannot have backing stores
-            backedWrapper = false;
-        }
-
-        if (backedWrapper)
-        {
-            wrapperType = getBackedWrapperTypeForType(mmd.getType(), instantiatedType, typeName);
-        }
-        else
-        {
-            wrapperType = getSimpleWrapperTypeForType(mmd.getType(), instantiatedType, typeName);
-        }
-        if (wrapperType == null)
-        {
-            throw new NucleusUserException(Localiser.msg("023011", mmd.getTypeName(), typeName, mmd.getFullFieldName()));
-        }
-
-        // Create the SCO wrapper
-        try
-        {
-            return (SCO) ClassUtils.newInstance(wrapperType, new Class[]{ObjectProvider.class, AbstractMemberMetaData.class}, new Object[]{ownerOP, mmd});
-        }
-        catch (UnsupportedOperationException uoe)
-        {
-            // Can't create backing store? so try simple wrapper
-            if (backedWrapper)
-            {
-                NucleusLogger.PERSISTENCE.warn("Creation of backed wrapper for " + mmd.getFullFieldName() + " unsupported, so trying simple wrapper");
-                wrapperType = getSimpleWrapperTypeForType(mmd.getType(), instantiatedType, typeName);
-                return (SCO) ClassUtils.newInstance(wrapperType, new Class[]{ObjectProvider.class, AbstractMemberMetaData.class}, new Object[]{ownerOP, mmd});
-            }
-
-            throw uoe;
-        }
-    }
-
-    /**
-     * Convenience method to return the backed wrapper type for the field definition. Wrapper is null if no backed wrapper is defined for the type.
-     * @param declaredType Declared type of the field
-     * @param instantiatedType Instantiated type of the field
-     * @param typeName Type name to try first
-     * @return The wrapper type
-     */
-    private Class getBackedWrapperTypeForType(Class declaredType, Class instantiatedType, String typeName)
-    {
-        Class wrapperType = getWrappedTypeBackedForType(typeName);
-        if (wrapperType == null)
-        {
-            // typeName not supported directly (no SCO wrapper for the precise type)
-            if (instantiatedType != null)
-            {
-                // Try the instantiated type
-                wrapperType = getWrappedTypeBackedForType(instantiatedType.getName());
-            }
-            if (wrapperType == null)
-            {
-                // Try the declared type
-                wrapperType = getWrappedTypeBackedForType(declaredType.getName());
-            }
-        }
-        return wrapperType;
-    }
-
-    /**
-     * Convenience method to return the simple wrapper type for the field definition. Wrapper is null if no simple wrapper is defined for the type.
-     * @param declaredType Declared type of the field
-     * @param instantiatedType Instantiated type of the field
-     * @param typeName Type name to try first
-     * @return The wrapper type
-     */
-    private Class getSimpleWrapperTypeForType(Class declaredType, Class instantiatedType, String typeName)
-    {
-        Class wrapperType = getWrapperTypeForType(typeName);
-        if (wrapperType == null)
-        {
-            // typeName not supported directly (no SCO wrapper for the precise type)
-            if (instantiatedType != null)
-            {
-                // Try the instantiated type
-                wrapperType = getWrapperTypeForType(instantiatedType.getName());
-            }
-            if (wrapperType == null)
-            {
-                // Try the declared type
-                wrapperType = getWrapperTypeForType(declaredType.getName());
-            }
-        }
-        return wrapperType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getTypeForSecondClassWrapper(java.lang.String)
-     */
-    @Override
-    public Class getTypeForSecondClassWrapper(String className)
-    {
-        Iterator iter = javaTypes.values().iterator();
-        while (iter.hasNext())
-        {
-            JavaType type = (JavaType)iter.next();
-            if (type.wrapperType != null && type.wrapperType.getName().equals(className))
-            {
-                return type.cls;
-            }
-            if (type.wrapperTypeBacked != null && type.wrapperTypeBacked.getName().equals(className))
-            {
-                return type.cls;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public ContainerAdapter getContainerAdapter(Object container)
-    {
-        ContainerHandler containerHandler = getContainerHandler(container.getClass());
-        return containerHandler == null ? null : containerHandler.getAdapter(container);
-    }
-    
-    @Override
-    public <H extends ContainerHandler> H getContainerHandler(Class containerClass)
-    {
-        H containerHandler = (H) containerHandlersByClass.get(containerClass);
-        if (containerHandler == null)
-        {
-            // Try to find the container handler using the registered type
-            JavaType type = findJavaTypeForClass(containerClass);
-            if (type != null && type.containerHandlerType != null)
-            {
-                Class[] parameterTypes = null;
-                Object[] parameters = null;
-                
-                Class[] classParameterTypes = new Class[]{Class.class};
-
-                // Allow ContainerHandlers that receive the container type on the constructor. e.g. ArrayHandler
-                if (ClassUtils.getConstructorWithArguments(type.containerHandlerType, classParameterTypes) != null )
-                {
-                    parameterTypes = classParameterTypes;
-                    parameters = new Object[] {containerClass};
-                }
-                
-                containerHandler = (H) ClassUtils.newInstance(type.containerHandlerType, parameterTypes, parameters);
-                
-                containerHandlersByClass.put(containerClass, containerHandler);
-            }
-        }
-
-        return containerHandler;
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getTypeConverterForName(java.lang.String)
-     */
-    @Override
-    public TypeConverter getTypeConverterForName(String converterName)
-    {
-        return converterName == null ? null : typeConverterByName.get(converterName);
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#registerConverter(java.lang.String, org.datanucleus.store.types.converters.TypeConverter, java.lang.Class, java.lang.Class, boolean, java.lang.String)
-     */
-    @Override
-    public void registerConverter(String name, TypeConverter converter, Class memberType, Class dbType, boolean autoApply, String autoApplyType)
-    {
-        // Add to lookup name -> converter
-        if (name != null)
-        {
-            typeConverterByName.put(name, converter);
-        }
-
-        // Add to lookup converter -> memberType
-        typeConverterDatastoreTypeByConverter.put(converter, dbType);
-
-        // Add to lookup converter -> dbType
-        typeConverterMemberTypeByConverter.put(converter, memberType);
-
-        // Add to lookup by memberType and dbType
-        Map<Class, TypeConverter> convertersForMember = typeConverterMap.get(memberType);
-        if (convertersForMember == null)
-        {
-            convertersForMember = new ConcurrentHashMap<Class, TypeConverter>();
-            typeConverterMap.put(memberType, convertersForMember);
-        }
-        // TODO We could already have a converter registered for this datastore type, so this replaces it!
-        convertersForMember.put(dbType, converter);
-
-        if (converter instanceof ClassStringConverter)
-        {
-            // ClassStringConverter is a special case that needs the CLR injecting. TODO Find a general way for converters to use this
-            ((ClassStringConverter)converter).setClassLoaderResolver(clr);
-        }
-
-        if (autoApply)
-        {
-            // Register converter to auto-apply
-            if (autoApplyConvertersByType == null)
-            {
-                autoApplyConvertersByType = new ConcurrentHashMap<String, TypeConverter>();
-            }
-            autoApplyConvertersByType.put(autoApplyType, converter);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getAutoApplyTypeConverterForType(java.lang.Class)
-     */
-    @Override
-    public TypeConverter getAutoApplyTypeConverterForType(Class memberType)
-    {
-        return autoApplyConvertersByType == null ? null : autoApplyConvertersByType.get(memberType.getName());
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#setDefaultTypeConverterForType(java.lang.Class, java.lang.String)
-     */
-    @Override
-    public void setDefaultTypeConverterForType(Class memberType, String converterName)
-    {
-        JavaType javaType = javaTypes.get(memberType.getName());
-        if (javaType == null)
-        {
-            return;
-        }
-
-        String typeConverterName = javaType.typeConverterName;
-        if (typeConverterName == null || !typeConverterName.equals(converterName))
-        {
-            javaType.typeConverterName = converterName;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getDefaultTypeConverterForType(java.lang.Class)
-     */
-    @Override
-    public TypeConverter getDefaultTypeConverterForType(Class memberType)
-    {
-        JavaType javaType = javaTypes.get(memberType.getName());
-        if (javaType == null)
-        {
-            return null;
-        }
-        String typeConverterName = javaType.typeConverterName;
-        if (typeConverterName == null)
-        {
-            return null;
-        }
-        return getTypeConverterForName(typeConverterName);
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getTypeConverterForType(java.lang.Class, java.lang.Class)
-     */
-    @Override
-    public TypeConverter getTypeConverterForType(Class memberType, Class datastoreType)
-    {
-        if (memberType == null)
-        {
-            return null;
-        }
-
-        Map<Class, TypeConverter> convertersForMember = typeConverterMap.get(memberType);
-        if (convertersForMember == null)
-        {
-            return null;
-        }
-        return convertersForMember.get(datastoreType);
-    }
-
-    /* (non-Javadoc)
-     * @see org.datanucleus.store.types.TypeManager#getTypeConvertersForType(java.lang.Class)
-     */
-    @Override
-    public Collection<TypeConverter> getTypeConvertersForType(Class memberType)
-    {
-        if (memberType == null)
-        {
-            return null;
-        }
-
-        Map<Class, TypeConverter> convertersForMember = typeConverterMap.get(memberType);
-        if (convertersForMember == null)
-        {
-            return null;
-        }
-        return convertersForMember.values();
-    }
-
-    /**
-     * Method to return the datastore type for the specified TypeConverter.
-     * @param conv The converter
-     * @param memberType The member type
-     * @return The datastore type
-     */
-    public Class getDatastoreTypeForTypeConverter(TypeConverter conv, Class memberType)
-    {
-        return typeConverterDatastoreTypeByConverter.get(conv);
-    }
-
-    /**
-     * Method to return the member type for the specified TypeConverter.
-     * @param conv The converter
-     * @param datastoreType The datastore type for this converter
-     * @return The member type
-     */
-    public Class getMemberTypeForTypeConverter(TypeConverter conv, Class datastoreType)
-    {
-        return typeConverterMemberTypeByConverter.get(conv);
-    }
-
-    /**
-     * Convenience method to return the JavaType for the specified class. If this class has a defined
-     * JavaType then returns it. If not then tries to find a superclass that is castable to the specified type.
-     * @param cls The class required
-     * @return The JavaType
-     */
-    protected JavaType findJavaTypeForClass(Class cls)
-    {
-        if (cls == null)
-        {
-            return null;
-        }
-        JavaType type = javaTypes.get(cls.getName());
-        if (type != null)
-        {
-            return type;
-        }
-
-        // Not supported so try to find one that is supported that this class derives from
-        Collection supportedTypes = new HashSet(javaTypes.values());
-        Iterator iter = supportedTypes.iterator();
-        while (iter.hasNext())
-        {
-            type = (JavaType)iter.next();
-            if (type.cls == cls && type.genericType == null)
-            {
-                return type;
-            }
-            if (!type.cls.getName().equals("java.lang.Object") && !type.cls.getName().equals("java.io.Serializable"))
-            {
-                Class componentCls = cls.isArray() ? cls.getComponentType() : null;
-                if (componentCls != null)
-                {
-                    // Array type
-                    if (type.cls.isArray() && type.cls.getComponentType().isAssignableFrom(componentCls))
-                    {
-                        javaTypes.put(cls.getName(), type); // Register this subtype for reference
-                        if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-                        {
-                            NucleusLogger.PERSISTENCE.debug(Localiser.msg("016001", cls.getName(), type.cls.getName()));
-                        }
-                        return type;
-                    }
-                }
-                else
-                {
-                    // Basic type
-                    if (type.cls.isAssignableFrom(cls) && type.genericType == null)
-                    {
-                        if (type.wrapperType == null || type.wrapperType.isAssignableFrom(cls)) // Dont do this when we have a wrapper type to consider since would lead to ClassCastException
-                        {
-                            javaTypes.put(cls.getName(), type); // Register this subtype for reference
-                            if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-                            {
-                                NucleusLogger.PERSISTENCE.debug(Localiser.msg("016001", cls.getName(), type.cls.getName()));
-                            }
-                            return type;
-                        }
-                    }
-                }
-            }
-        }
-
-        // Not supported
-        return null;
-    }
-
-    /**
-     * Convenience method to return the JavaType for the specified class. If this class has a defined
-     * JavaType then returns it. If not then tries to find a superclass that is castable to the specified
-     * type.
-     * @param cls The class required
-     * @param genericType Any generic type specified for the element
-     * @return The JavaType
-     */
-    protected JavaType findJavaTypeForCollectionClass(Class cls, Class genericType)
-    {
-        if (cls == null)
-        {
-            return null;
-        }
-        else if (genericType == null)
-        {
-            return findJavaTypeForClass(cls);
-        }
-
-        String typeName = cls.getName() + "<" + genericType.getName() + ">";
-        JavaType type = javaTypes.get(typeName);
-        if (type != null)
-        {
-            return type;
-        }
-
-        // Not supported so try to find one that is supported that this class derives from
-        Collection supportedTypes = new HashSet(javaTypes.values());
-        Iterator iter = supportedTypes.iterator();
-        while (iter.hasNext())
-        {
-            type = (JavaType)iter.next();
-            if (type.cls.isAssignableFrom(cls))
-            {
-                if (type.genericType != null && type.genericType.isAssignableFrom(genericType))
-                {
-                    javaTypes.put(typeName, type); // Register this subtype for reference
-                    return type;
-                }
-            }
-        }
-
-        // Fallback to just matching the collection type and forget the generic detail
-        return findJavaTypeForClass(cls);
-    }
-
-    static class JavaType implements Serializable
-    {
-        private static final long serialVersionUID = -811442140006259453L;
-        final Class cls;
-        final Class genericType;
-        final boolean embedded;
-        final boolean dfg;
-        final Class wrapperType;
-        final Class wrapperTypeBacked;
-        String typeConverterName;
-        final Class containerHandlerType;
-
-        public JavaType(Class cls, Class genericType, boolean embedded, boolean dfg, Class wrapperType, Class wrapperTypeBacked, Class containerHandlerType, String typeConverterName)
-        {
-            this.cls = cls;
-            this.genericType = genericType;
-            this.embedded = embedded;
-            this.dfg = dfg;
-            this.wrapperType = wrapperType;
-            this.wrapperTypeBacked = wrapperTypeBacked != null ? wrapperTypeBacked : wrapperType;
-            this.containerHandlerType = containerHandlerType;
-            this.typeConverterName = typeConverterName;
-        }
-    }
-
-    /**
-     * Method to load the java types that we support out of the box.
-     * This includes all built-in types, as well as all types registered via the plugin mechanism.
-     * @param mgr the PluginManager
-     */
-    private void loadJavaTypes(PluginManager mgr)
-    {
-        if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-        {
-            NucleusLogger.PERSISTENCE.debug(Localiser.msg("016003"));
-        }
-
-        // Load up built-in types
-        addJavaType(boolean.class, null, true, true, null, null, null, null);
-        addJavaType(byte.class, null, true, true, null, null, null, null);
-        addJavaType(char.class, null, true, true, null, null, null, null);
-        addJavaType(double.class, null, true, true, null, null, null, null);
-        addJavaType(float.class, null, true, true, null, null, null, null);
-        addJavaType(int.class, null, true, true, null, null, null, null);
-        addJavaType(long.class, null, true, true, null, null, null, null);
-        addJavaType(short.class, null, true, true, null, null, null, null);
-
-        addJavaType(Boolean.class, null, true, true, null, null, null, null);
-        addJavaType(Byte.class, null, true, true, null, null, null, null);
-        addJavaType(Character.class, null, true, true, null, null, null, null);
-        addJavaType(Double.class, null, true, true, null, null, null, null);
-        addJavaType(Float.class, null, true, true, null, null, null, null);
-        addJavaType(Integer.class, null, true, true, null, null, null, null);
-        addJavaType(Long.class, null, true, true, null, null, null, null);
-        addJavaType(Short.class, null, true, true, null, null, null, null);
-
-        addJavaType(Number.class, null, true, true, null, null, null, null);
-        addJavaType(String.class, null, true, true, null, null, null, null);
-        addJavaType(Enum.class, null, true, true, null, null, null, null);
-        addJavaType(StringBuffer.class, null, true, true, null, null, null, "dn.stringbuffer-string");
-        addJavaType(StringBuilder.class, null, true, true, null, null, null, "dn.stringbuilder-string");
-        addJavaType(Class.class, null, true, true, null, null, null, "dn.class-string");
-
-        if (ClassUtils.isClassPresent("java.awt.Color", clr)) // Not present in some JDKs
-        {
-            // java.awt
-            addJavaType(java.awt.image.BufferedImage.class, null, true, false, null, null, null, "dn.bufferedimage-bytearray");
-            addJavaType(java.awt.Color.class, null, true, true, null, null, null, "dn.color-string");
-        }
-
-        addJavaType(java.math.BigDecimal.class, null, true, true, null, null, null, null);
-        addJavaType(java.math.BigInteger.class, null, true, true, null, null, null, null);
-
-        // java.net
-        addJavaType(java.net.URL.class, null, true, true, null, null, null, "dn.url-string");
-        addJavaType(java.net.URI.class, null, true, true, null, null, null, "dn.uri-string");
-
-        // date/time/java.time
-        addJavaType(java.sql.Date.class, null, true, true, org.datanucleus.store.types.wrappers.SqlDate.class, null, null, null);
-        addJavaType(java.sql.Time.class, null, true, true, org.datanucleus.store.types.wrappers.SqlTime.class, null, null, null);
-        addJavaType(java.sql.Timestamp.class, null, true, true, org.datanucleus.store.types.wrappers.SqlTimestamp.class, null, null, null);
-        addJavaType(java.util.Date.class, null, true, true, org.datanucleus.store.types.wrappers.Date.class, null, null, null);
-        addJavaType(Calendar.class, null, true, true, org.datanucleus.store.types.wrappers.GregorianCalendar.class, null, null, "dn.calendar-string");
-        addJavaType(GregorianCalendar.class, null, true, true, org.datanucleus.store.types.wrappers.GregorianCalendar.class, null, null, "dn.calendar-string");
-
-        addJavaType(java.time.LocalDate.class, null, true, true, null, null, null, "dn.localdate-sqldate");
-        addJavaType(java.time.LocalDateTime.class, null, true, true, null, null, null, "dn.localdatetime-timestamp");
-        addJavaType(java.time.LocalTime.class, null, true, true, null, null, null, "dn.localtime-sqltime");
-        addJavaType(java.time.OffsetTime.class, null, true, true, null, null, null, "dn.offsettime-sqltime");
-        addJavaType(java.time.OffsetDateTime.class, null, true, true, null, null, null, "dn.offsetdatetime-timestamp");
-        addJavaType(java.time.Duration.class, null, true, true, null, null, null, "dn.duration-long");
-        addJavaType(java.time.Instant.class, null, true, true, null, null, null, "dn.instant-timestamp");
-        addJavaType(java.time.Period.class, null, true, true, null, null, null, "dn.period-string");
-        addJavaType(java.time.Year.class, null, true, true, null, null, null, "dn.year-integer");
-        addJavaType(java.time.YearMonth.class, null, true, true, null, null, null, "dn.yearmonth-string");
-        addJavaType(java.time.MonthDay.class, null, true, true, null, null, null, "dn.monthday-string");
-        addJavaType(java.time.ZoneId.class, null, true, true, null, null, null, "dn.zoneid-string");
-        addJavaType(java.time.ZoneOffset.class, null, true, true, null, null, null, "dn.zoneoffset-string");
-        addJavaType(java.time.ZonedDateTime.class, null, true, true, null, null, null, "dn.zoneddatetime-timestamp");
-
-        // java.util
-        addJavaType(Locale.class, null, true, true, null, null, null, "dn.locale-string");
-        addJavaType(Currency.class, null, true, true, null, null, null, "dn.currency-string");
-        addJavaType(UUID.class, null, true, true, null, null, null, "dn.uuid-string");
-        addJavaType(TimeZone.class, null, true, true, null, null, null, "dn.timezone-string");
-
-        addJavaType(ArrayList.class, null, false, false, org.datanucleus.store.types.wrappers.ArrayList.class, 
-            org.datanucleus.store.types.wrappers.backed.ArrayList.class, ArrayListHandler.class, null);
-
-        String arrayListInnerType = "java.util.Arrays$ArrayList";
-        Class arrayListInnerTypeCls = clr.classForName(arrayListInnerType);
-        addJavaType(arrayListInnerTypeCls, null, false, false, org.datanucleus.store.types.wrappers.List.class, org.datanucleus.store.types.wrappers.backed.List.class,
-            org.datanucleus.store.types.containers.ArrayListHandler.class, null);
-
-        addJavaType(BitSet.class, null, true, true, org.datanucleus.store.types.wrappers.BitSet.class, null, null, "dn.bitset-string");
-        addJavaType(Collection.class, null, false, false, org.datanucleus.store.types.wrappers.Collection.class, org.datanucleus.store.types.wrappers.backed.Collection.class, 
-            JDKCollectionHandler.class, null);
-        addJavaType(HashMap.class, null, false, false, org.datanucleus.store.types.wrappers.HashMap.class, org.datanucleus.store.types.wrappers.backed.HashMap.class,
-            HashMapHandler.class, null);
-        addJavaType(HashSet.class, null, false, false, org.datanucleus.store.types.wrappers.HashSet.class, org.datanucleus.store.types.wrappers.backed.HashSet.class,
-            HashSetHandler.class, null);
-        addJavaType(Hashtable.class, null, false, false, org.datanucleus.store.types.wrappers.Hashtable.class, org.datanucleus.store.types.wrappers.backed.Hashtable.class,
-            HashtableHandler.class, null);
-        addJavaType(LinkedHashMap.class, null, false, false, org.datanucleus.store.types.wrappers.LinkedHashMap.class, org.datanucleus.store.types.wrappers.backed.LinkedHashMap.class,
-            LinkedHashMapHandler.class, null);
-        addJavaType(LinkedHashSet.class, null, false, false, org.datanucleus.store.types.wrappers.LinkedHashSet.class, org.datanucleus.store.types.wrappers.backed.LinkedHashSet.class,
-            LinkedHashSetHandler.class, null);
-        addJavaType(LinkedList.class, null, false, false, org.datanucleus.store.types.wrappers.LinkedList.class, org.datanucleus.store.types.wrappers.backed.LinkedList.class,
-            LinkedListHandler.class, null);
-        addJavaType(List.class, null, false, false, org.datanucleus.store.types.wrappers.List.class, org.datanucleus.store.types.wrappers.backed.List.class,
-            ArrayListHandler.class, null);
-        addJavaType(Map.class, null, false, false, org.datanucleus.store.types.wrappers.Map.class, org.datanucleus.store.types.wrappers.backed.Map.class,
-            HashMapHandler.class, null);
-        addJavaType(PriorityQueue.class, null, false, false, org.datanucleus.store.types.wrappers.PriorityQueue.class, org.datanucleus.store.types.wrappers.backed.PriorityQueue.class,
-            PriorityQueueHandler.class, null);
-        addJavaType(Properties.class, null, false, false, org.datanucleus.store.types.wrappers.Properties.class, org.datanucleus.store.types.wrappers.backed.Properties.class,
-            PropertiesHandler.class, null);
-        addJavaType(Queue.class, null, false, false, org.datanucleus.store.types.wrappers.Queue.class, org.datanucleus.store.types.wrappers.backed.Queue.class,
-            PriorityQueueHandler.class, null);
-        addJavaType(Set.class, null, false, false, org.datanucleus.store.types.wrappers.Set.class, org.datanucleus.store.types.wrappers.backed.Set.class,
-            HashSetHandler.class, null);
-        addJavaType(SortedMap.class, null, false, false, org.datanucleus.store.types.wrappers.SortedMap.class, org.datanucleus.store.types.wrappers.backed.SortedMap.class,
-            TreeMapHandler.class, null);
-        addJavaType(SortedSet.class, null, false, false, org.datanucleus.store.types.wrappers.SortedSet.class, org.datanucleus.store.types.wrappers.backed.SortedSet.class,
-            TreeSetHandler.class, null);
-        addJavaType(Stack.class, null, false, false, org.datanucleus.store.types.wrappers.Stack.class, org.datanucleus.store.types.wrappers.backed.Stack.class,
-            StackHandler.class, null);
-        addJavaType(TreeMap.class, null, false, false, org.datanucleus.store.types.wrappers.TreeMap.class, org.datanucleus.store.types.wrappers.backed.TreeMap.class,
-            TreeMapHandler.class, null);
-        addJavaType(TreeSet.class, null, false, false, org.datanucleus.store.types.wrappers.TreeSet.class, org.datanucleus.store.types.wrappers.backed.TreeSet.class,
-            TreeSetHandler.class, null);
-        addJavaType(Vector.class, null, false, false, org.datanucleus.store.types.wrappers.Vector.class, org.datanucleus.store.types.wrappers.backed.Vector.class,
-            VectorHandler.class, null);
-        addJavaType(Optional.class, null, false, false, null, null, OptionalHandler.class, null);
-
-        // arrays
-        addJavaType(boolean[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(byte[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(char[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(double[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(float[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(int[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(long[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(short[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Boolean[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Byte[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Character[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Double[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Float[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Integer[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Long[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Short[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Number[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(String[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(BigDecimal[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(BigInteger[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(java.util.Date[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(java.util.Locale[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Enum[].class, null, true, false, null, null, ArrayHandler.class, null);
-        addJavaType(Object[].class, null, true, false, null, null, ArrayHandler.class, null);
-
-        // Map of java type priorities, keyed by the class name
-        final Map<String, Integer> javaTypePriorities = new HashMap<>();
-        
-        // Add on any plugin mechanism types
-        ConfigurationElement[] elems = mgr.getConfigurationElementsForExtension("org.datanucleus.java_type", null, null);
-        if (elems != null)
-        {
-            for (int i=0; i<elems.length; i++)
-            {
-                String javaName = elems[i].getAttribute("name").trim();
-                String genericTypeName = elems[i].getAttribute("generic-type");
-                String embeddedString = elems[i].getAttribute("embedded");
-                String dfgString = elems[i].getAttribute("dfg");
-                String priorityString = elems[i].getAttribute("priority");
-                String wrapperType = elems[i].getAttribute("wrapper-type");
-                String wrapperTypeBacked = elems[i].getAttribute("wrapper-type-backed");
-                String typeConverterName = elems[i].getAttribute("converter-name");
-                String containerHandlerType = elems[i].getAttribute("container-handler");
-
-                boolean embedded = false;
-                if (embeddedString != null && embeddedString.equalsIgnoreCase("true"))
-                {
-                    embedded = true;
-                }
-                boolean dfg = false;
-                if (dfgString != null && dfgString.equalsIgnoreCase("true"))
-                {
-                    dfg = true;
-                }
-                int priority = 0;
-                if (priorityString != null && !StringUtils.isWhitespace(priorityString))
-                {
-                    try {
-                        priority = Integer.parseInt(priorityString.trim());
-                    } catch (Exception e) {
-                        // if cannot parse, silently fallback
-                        priority = 0;
-                    }
-                }
-                if (!StringUtils.isWhitespace(wrapperType))
-                {
-                    wrapperType = wrapperType.trim();
-                }
-                else
-                {
-                    wrapperType = null;
-                }
-                if (!StringUtils.isWhitespace(wrapperTypeBacked))
-                {
-                    wrapperTypeBacked = wrapperTypeBacked.trim();
-                }
-                else
-                {
-                    wrapperTypeBacked = null;
-                }
-                if (!StringUtils.isWhitespace(containerHandlerType))
-                {
-                    containerHandlerType = containerHandlerType.trim();
-                }
-                else
-                {
-                    containerHandlerType = null;
-                }
-
-                try
-                {
-                    Class cls = clr.classForName(javaName);
-                    Class genericType = null;
-                    String javaTypeName = cls.getName();
-                    if (!StringUtils.isWhitespace(genericTypeName))
-                    {
-                        genericType = clr.classForName(genericTypeName);
-                        javaTypeName += "<" + genericTypeName + ">";
-                    }
-
-                    // Register entries for a java type based on the "priority" flag,
-                    // where higher priority is allowed to override lower priority. 
-                    
-                    boolean doRegister = !javaTypes.containsKey(javaTypeName);
-                    if(!doRegister) {
-                        // check whether new priority wins over already registered priority
-                        final int priorityToBeat = 
-                                Optional.ofNullable(javaTypePriorities.get(javaTypeName)).orElse(0);
-                        doRegister = priority > priorityToBeat;
-                    }
-                    
-                    if (doRegister)
-                    {
-
-                        Class wrapperClass = loadClass(mgr, elems, i, wrapperType, "016005");
-                        Class wrapperClassBacked = loadClass(mgr, elems, i, wrapperTypeBacked, "016005");
-                        Class containerHandlerClass = loadClass(mgr, elems, i, containerHandlerType, "016009");
-
-                        String typeName = cls.getName();
-                        if (genericType != null)
-                        {
-                            // "Collection<String>"
-                            typeName += "<" + genericType.getName() + ">";
-                        }
-                        javaTypes.put(typeName, new JavaType(cls, genericType, embedded, dfg, wrapperClass, wrapperClassBacked, containerHandlerClass, typeConverterName));
-
-                        // keep track of registered priority values, 
-                        // as an optimization, save heap usage, don't collect priority<=0 
-                        if(priority>0) {
-                            javaTypePriorities.put(javaTypeName, priority);
-                        }
-                    }
-                }
-                catch (ClassNotResolvedException cnre)
-                {
-                    NucleusLogger.PERSISTENCE.debug("Not enabling java type support for " + javaName + " : java type not present in CLASSPATH");
-                }
-                catch (Exception e)
-                {
-                    NucleusLogger.PERSISTENCE.debug("Not enabling java type support for " + javaName + " : " + e.getMessage());
-                }
-            }
-        }
-        if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-        {
-            List<String> typesList = new ArrayList<String>(javaTypes.keySet());
-            Collections.sort(typesList, ALPHABETICAL_ORDER_STRING);
-            NucleusLogger.PERSISTENCE.debug(Localiser.msg("016006", StringUtils.collectionToString(typesList)));
-        }
-    }
-
-    private void addJavaType(Class cls, Class genericType, boolean embedded, boolean dfg, Class wrapperType, Class wrapperTypeBacked, Class containerHandlerType, String typeConverterName)
-    {
-        String typeName = cls.getName();
-        if (genericType != null)
-        {
-            // "Collection<String>"
-            typeName += "<" + genericType.getName() + ">";
-        }
-        javaTypes.put(typeName, new JavaType(cls, genericType, embedded, dfg, wrapperType, wrapperTypeBacked, containerHandlerType, typeConverterName));
-    }
-
-    private Class loadClass(PluginManager mgr, ConfigurationElement[] elems, int i, String className, String messageKey)
-    {
-        Class result = null;
-        if (className != null)
-        {
-            try
-            {
-                result = mgr.loadClass(elems[i].getExtension().getPlugin().getSymbolicName(), className);
-            }
-            catch (NucleusException jpe)
-            {
-                // Impossible to load the class implementation from this plugin
-                NucleusLogger.PERSISTENCE.error(Localiser.msg(messageKey, className));
-                throw new NucleusException(Localiser.msg(messageKey, className));
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Method to load the java type that are currently registered in the PluginManager.
-     * @param mgr the PluginManager
-     */
-    private void loadTypeConverters(PluginManager mgr)
-    {
-        if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-        {
-            NucleusLogger.PERSISTENCE.debug(Localiser.msg("016007"));
-        }
-
-        // Load up built-in converters
-        registerConverter("dn.boolean-yn", new org.datanucleus.store.types.converters.BooleanYNConverter(), Boolean.class, Character.class, false, null);
-        registerConverter("dn.boolean-integer", new org.datanucleus.store.types.converters.BooleanIntegerConverter(), Boolean.class, Integer.class, false, null);
-        registerConverter("dn.character-string", new org.datanucleus.store.types.converters.CharacterStringConverter(), Character.class, String.class, false, null);
-        registerConverter("dn.bigdecimal-string", new org.datanucleus.store.types.converters.BigDecimalStringConverter(), BigDecimal.class, String.class, false, null);
-        registerConverter("dn.bigdecimal-double", new org.datanucleus.store.types.converters.BigDecimalDoubleConverter(), BigDecimal.class, Double.class, false, null);
-        registerConverter("dn.biginteger-string", new org.datanucleus.store.types.converters.BigIntegerStringConverter(), BigInteger.class, String.class, false, null);
-        registerConverter("dn.biginteger-long", new org.datanucleus.store.types.converters.BigIntegerLongConverter(), BigInteger.class, Long.class, false, null);
-        registerConverter("dn.bitset-string", new org.datanucleus.store.types.converters.BitSetStringConverter(), BitSet.class, String.class, false, null);
-
-        if (ClassUtils.isClassPresent("java.awt.Color", clr)) // Not present in some JDKs
-        {
-            // java.awt
-            registerConverter("dn.color-string", new org.datanucleus.store.types.converters.ColorStringConverter(), java.awt.Color.class, String.class, false, null);
-            registerConverter("dn.color-components", new org.datanucleus.store.types.converters.ColorComponentsConverter(), java.awt.Color.class, int[].class, false, null);
-            registerConverter("dn.bufferedimage-bytearray", new org.datanucleus.store.types.converters.BufferedImageByteArrayConverter(), java.awt.image.BufferedImage.class, byte[].class, false, null);
-            registerConverter("dn.bufferedimage-bytebuffer", new org.datanucleus.store.types.converters.BufferedImageByteBufferConverter(), java.awt.image.BufferedImage.class, ByteBuffer.class, false, null);
-        }
-
-        registerConverter("dn.class-string", new org.datanucleus.store.types.converters.ClassStringConverter(), Class.class, String.class, false, null);
-        registerConverter("dn.integer-string", new org.datanucleus.store.types.converters.IntegerStringConverter(), Integer.class, String.class, false, null);
-        registerConverter("dn.long-string", new org.datanucleus.store.types.converters.LongStringConverter(), Long.class, String.class, false, null);
-        registerConverter("dn.currency-string", new org.datanucleus.store.types.converters.CurrencyStringConverter(), Currency.class, String.class, false, null);
-        registerConverter("dn.locale-string", new org.datanucleus.store.types.converters.LocaleStringConverter(), Locale.class, String.class, false, null);
-        registerConverter("dn.stringbuffer-string", new org.datanucleus.store.types.converters.StringBufferStringConverter(), StringBuffer.class, String.class, false, null);
-        registerConverter("dn.stringbuilder-string", new org.datanucleus.store.types.converters.StringBuilderStringConverter(), StringBuilder.class, String.class, false, null);
-        registerConverter("dn.timezone-string", new org.datanucleus.store.types.converters.TimeZoneStringConverter(), TimeZone.class, String.class, false, null);
-        registerConverter("dn.uri-string", new org.datanucleus.store.types.converters.URIStringConverter(), java.net.URI.class, String.class, false, null);
-        registerConverter("dn.url-string", new org.datanucleus.store.types.converters.URLStringConverter(), java.net.URL.class, String.class, false, null);
-        registerConverter("dn.uuid-string", new org.datanucleus.store.types.converters.UUIDStringConverter(), UUID.class, String.class, false, null);
-
-        // Date/Time
-        registerConverter("dn.date-long", new org.datanucleus.store.types.converters.DateLongConverter(), java.util.Date.class, Long.class, false, null);
-        registerConverter("dn.date-string", new org.datanucleus.store.types.converters.DateStringConverter(), java.util.Date.class, String.class, false, null);
-
-        registerConverter("dn.sqldate-long", new org.datanucleus.store.types.converters.SqlDateLongConverter(), java.sql.Date.class, Long.class, false, null);
-        registerConverter("dn.sqldate-string", new org.datanucleus.store.types.converters.SqlDateStringConverter(), java.sql.Date.class, String.class, false, null);
-        registerConverter("dn.sqldate-date", new org.datanucleus.store.types.converters.SqlDateStringConverter(), java.sql.Date.class, java.util.Date.class, false, null);
-        registerConverter("dn.sqltime-long", new org.datanucleus.store.types.converters.SqlTimeStringConverter(), java.sql.Time.class, Long.class, false, null);
-        registerConverter("dn.sqltime-string", new org.datanucleus.store.types.converters.SqlTimeStringConverter(), java.sql.Time.class, String.class, false, null);
-        registerConverter("dn.sqltime-date", new org.datanucleus.store.types.converters.SqlTimeStringConverter(), java.sql.Time.class, java.util.Date.class, false, null);
-        registerConverter("dn.sqltimestamp-long", new org.datanucleus.store.types.converters.SqlTimestampStringConverter(), java.sql.Timestamp.class, Long.class, false, null);
-        registerConverter("dn.sqltimestamp-date", new org.datanucleus.store.types.converters.SqlTimestampStringConverter(), java.sql.Timestamp.class, java.util.Date.class, false, null);
-        registerConverter("dn.sqltimestamp-string", new org.datanucleus.store.types.converters.SqlTimestampStringConverter(), java.sql.Timestamp.class, String.class, false, null);
-
-        registerConverter("dn.calendar-string", new org.datanucleus.store.types.converters.CalendarStringConverter(), Calendar.class, String.class, false, null);
-        registerConverter("dn.calendar-date", new org.datanucleus.store.types.converters.CalendarDateConverter(), Calendar.class, java.util.Date.class, false, null);
-        registerConverter("dn.calendar-timestamp", new org.datanucleus.store.types.converters.CalendarTimestampConverter(), Calendar.class, java.sql.Timestamp.class, false, null);
-        registerConverter("dn.calendar-components", new org.datanucleus.store.types.converters.CalendarComponentsConverter(), Calendar.class, Object[].class, false, null);
-
-        // Serializable
-        registerConverter("dn.serializable-string", new org.datanucleus.store.types.converters.SerializableStringConverter(), java.io.Serializable.class, String.class, false, null);
-        registerConverter("dn.serializable-bytearray", new org.datanucleus.store.types.converters.SerializableByteArrayConverter(), java.io.Serializable.class, byte[].class, false, null);
-        registerConverter("dn.serializable-bytebuffer", new org.datanucleus.store.types.converters.SerializableByteBufferConverter(), java.io.Serializable.class, ByteBuffer.class, false, null);
-
-        // Arrays
-        registerConverter("dn.bytearray-bytebuffer", new org.datanucleus.store.types.converters.ByteArrayByteBufferConverter(), byte[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.booleanarray-bytebuffer", new org.datanucleus.store.types.converters.BooleanArrayByteBufferConverter(), boolean[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.chararray-bytebuffer", new org.datanucleus.store.types.converters.CharArrayByteBufferConverter(), char[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.doublearray-bytebuffer", new org.datanucleus.store.types.converters.DoubleArrayByteBufferConverter(), double[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.floatarray-bytebuffer", new org.datanucleus.store.types.converters.FloatArrayByteBufferConverter(), float[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.intarray-bytebuffer", new org.datanucleus.store.types.converters.IntArrayByteBufferConverter(), int[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.longarray-bytebuffer", new org.datanucleus.store.types.converters.LongArrayByteBufferConverter(), long[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.shortarray-bytebuffer", new org.datanucleus.store.types.converters.ShortArrayByteBufferConverter(), short[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.bigintegerarray-bytebuffer", new org.datanucleus.store.types.converters.BigIntegerArrayByteBufferConverter(), BigInteger[].class, ByteBuffer.class, false, null);
-        registerConverter("dn.bigdecimalarray-bytebuffer", new org.datanucleus.store.types.converters.BigDecimalArrayByteBufferConverter(), BigDecimal[].class, ByteBuffer.class, false, null);
-
-        // java.time
-        registerConverter("dn.localdate-string", new org.datanucleus.store.types.converters.LocalDateStringConverter(), LocalDate.class, String.class, false, null);
-        registerConverter("dn.localdate-sqldate", new org.datanucleus.store.types.converters.LocalDateSqlDateConverter(), LocalDate.class, java.sql.Date.class, false, null);
-        registerConverter("dn.localdate-date", new org.datanucleus.store.types.converters.LocalDateDateConverter(), LocalDate.class, java.util.Date.class, false, null);
-
-        registerConverter("dn.localtime-string", new org.datanucleus.store.types.converters.LocalTimeStringConverter(), LocalTime.class, String.class, false, null);
-        registerConverter("dn.localtime-sqltime", new org.datanucleus.store.types.converters.LocalTimeSqlTimeConverter(), LocalTime.class, java.sql.Time.class, false, null);
-        registerConverter("dn.localtime-date", new org.datanucleus.store.types.converters.LocalTimeDateConverter(), LocalTime.class, java.util.Date.class, false, null);
-        registerConverter("dn.localtime-long", new org.datanucleus.store.types.converters.LocalTimeLongConverter(), LocalTime.class, Long.class, false, null);
-
-        registerConverter("dn.localdatetime-string", new org.datanucleus.store.types.converters.LocalDateTimeStringConverter(), LocalDateTime.class, String.class, false, null);
-        registerConverter("dn.localdatetime-timestamp", new org.datanucleus.store.types.converters.LocalDateTimeTimestampConverter(), LocalDateTime.class, java.sql.Timestamp.class, false, null);
-        registerConverter("dn.localdatetime-date", new org.datanucleus.store.types.converters.LocalDateTimeDateConverter(), LocalDateTime.class, java.util.Date.class, false, null);
-
-        registerConverter("dn.offsettime-string", new org.datanucleus.store.types.converters.OffsetTimeStringConverter(), OffsetTime.class, String.class, false, null);
-        registerConverter("dn.offsettime-long", new org.datanucleus.store.types.converters.OffsetTimeLongConverter(), OffsetTime.class, Long.class, false, null);
-        registerConverter("dn.offsettime-sqltime", new org.datanucleus.store.types.converters.OffsetTimeSqlTimeConverter(), OffsetTime.class, java.sql.Time.class, false, null);
-
-        registerConverter("dn.offsetdatetime-string", new org.datanucleus.store.types.converters.OffsetDateTimeStringConverter(), OffsetDateTime.class, String.class, false, null);
-        registerConverter("dn.offsetdatetime-timestamp", new org.datanucleus.store.types.converters.OffsetDateTimeTimestampConverter(), OffsetDateTime.class, java.sql.Timestamp.class, false, null);
-        registerConverter("dn.offsetdatetime-date", new org.datanucleus.store.types.converters.OffsetDateTimeDateConverter(), OffsetDateTime.class, java.util.Date.class, false, null);
-
-        registerConverter("dn.duration-string", new org.datanucleus.store.types.converters.DurationStringConverter(), Duration.class, String.class, false, null);
-        registerConverter("dn.duration-long", new org.datanucleus.store.types.converters.DurationLongConverter(), Duration.class, Long.class, false, null);
-        registerConverter("dn.duration-double", new org.datanucleus.store.types.converters.DurationDoubleConverter(), Duration.class, Double.class, false, null);
-
-        registerConverter("dn.period-string", new org.datanucleus.store.types.converters.PeriodStringConverter(), Period.class, String.class, false, null);
-        registerConverter("dn.period-components", new org.datanucleus.store.types.converters.PeriodComponentsConverter(), Period.class, int[].class, false, null);
-
-        registerConverter("dn.instant-timestamp", new org.datanucleus.store.types.converters.InstantTimestampConverter(), Instant.class, java.sql.Timestamp.class, false, null);
-        registerConverter("dn.instant-date", new org.datanucleus.store.types.converters.InstantDateConverter(), Instant.class, java.util.Date.class, false, null);
-        registerConverter("dn.instant-string", new org.datanucleus.store.types.converters.InstantStringConverter(), Instant.class, String.class, false, null);
-        registerConverter("dn.instant-long", new org.datanucleus.store.types.converters.InstantLongConverter(), Instant.class, Long.class, false, null);
-
-        registerConverter("dn.year-string", new org.datanucleus.store.types.converters.YearStringConverter(), Year.class, String.class, false, null);
-        registerConverter("dn.year-integer", new org.datanucleus.store.types.converters.YearIntegerConverter(), Year.class, Integer.class, false, null);
-
-        registerConverter("dn.yearmonth-string", new org.datanucleus.store.types.converters.YearMonthStringConverter(), YearMonth.class, String.class, false, null);
-        registerConverter("dn.yearmonth-components", new org.datanucleus.store.types.converters.YearMonthComponentsConverter(), YearMonth.class, int[].class, false, null);
-        registerConverter("dn.yearmonth-sqldate", new org.datanucleus.store.types.converters.YearMonthSqlDateConverter(), YearMonth.class, java.sql.Date.class, false, null);
-        registerConverter("dn.yearmonth-date", new org.datanucleus.store.types.converters.YearMonthDateConverter(), YearMonth.class, java.util.Date.class, false, null);
-
-        registerConverter("dn.monthday-string", new org.datanucleus.store.types.converters.MonthDayStringConverter(), MonthDay.class, String.class, false, null);
-        registerConverter("dn.monthday-components", new org.datanucleus.store.types.converters.MonthDayComponentsConverter(), MonthDay.class, int[].class, false, null);
-        registerConverter("dn.monthday-sqldate", new org.datanucleus.store.types.converters.MonthDaySqlDateConverter(), MonthDay.class, java.sql.Date.class, false, null);
-        registerConverter("dn.monthday-date", new org.datanucleus.store.types.converters.MonthDayDateConverter(), MonthDay.class, java.util.Date.class, false, null);
-
-        registerConverter("dn.zoneid-string", new org.datanucleus.store.types.converters.ZoneIdStringConverter(), ZoneId.class, String.class, false, null);
-        registerConverter("dn.zoneoffset-string", new org.datanucleus.store.types.converters.ZoneOffsetStringConverter(), ZoneOffset.class, String.class, false, null);
-        registerConverter("dn.zoneddatetime-string", new org.datanucleus.store.types.converters.ZonedDateTimeStringConverter(), ZonedDateTime.class, String.class, false, null);
-        registerConverter("dn.zoneddatetime-timestamp", new org.datanucleus.store.types.converters.ZonedDateTimeTimestampConverter(), ZonedDateTime.class, java.sql.Timestamp.class, false, null);
-
-        // Add on any plugin mechanism types
-        ConfigurationElement[] elems = mgr.getConfigurationElementsForExtension("org.datanucleus.type_converter", null, null);
-        if (elems != null)
-        {
-            for (int i=0; i<elems.length; i++)
-            {
-                String name = elems[i].getAttribute("name").trim();
-                String memberTypeName = elems[i].getAttribute("member-type").trim();
-                String datastoreTypeName = elems[i].getAttribute("datastore-type").trim();
-                String converterClsName = elems[i].getAttribute("converter-class").trim();
-                Class memberType = null;
-                try
-                {
-                    // Use plugin manager to instantiate the converter in case its in separate plugin
-                    TypeConverter conv = (TypeConverter) mgr.createExecutableExtension("org.datanucleus.type_converter", "name", name, "converter-class", null, null);
-                    memberType = clr.classForName(memberTypeName);
-                    Class datastoreType = clr.classForName(datastoreTypeName);
-                    registerConverter(name, conv, memberType, datastoreType, false, null);
-                }
-                catch (Exception e)
-                {
-                    if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-                    {
-                        if (memberType != null)
-                        {
-                            NucleusLogger.PERSISTENCE.debug("TypeConverter for " + memberTypeName + "<->" +
-                                datastoreTypeName + " using " + converterClsName + " not instantiable (missing dependencies?) so ignoring");
-                        }
-                        else
-                        {
-                            NucleusLogger.PERSISTENCE.debug("TypeConverter for " + memberTypeName + "<->" +
-                                datastoreTypeName + " ignored since java type not present in CLASSPATH");
-                        }
-                    }
-                }
-            }
-        }
-
-        if (NucleusLogger.PERSISTENCE.isDebugEnabled())
-        {
-            NucleusLogger.PERSISTENCE.debug(Localiser.msg("016008"));
-            if (typeConverterMap != null)
-            {
-                List<Class> typesList = new ArrayList<Class>(typeConverterMap.keySet());
-                Collections.sort(typesList, ALPHABETICAL_ORDER);
-                for (Class javaType : typesList)
-                {
-                    Set<Class> datastoreTypes = typeConverterMap.get(javaType).keySet();
-                    StringBuilder str = new StringBuilder();
-                    for (Class datastoreCls : datastoreTypes)
-                    {
-                        if (str.length() > 0)
-                        {
-                            str.append(',');
-                        }
-                        str.append(StringUtils.getNameOfClass(datastoreCls));
-                    }
-                    NucleusLogger.PERSISTENCE.debug("TypeConverter(s) available for " + StringUtils.getNameOfClass(javaType) + " to : " + str.toString());
-                }
-            }
-        }
-    }
-
-    private static Comparator<Class> ALPHABETICAL_ORDER = new Comparator<Class>() 
-    {
-        public int compare(Class cls1, Class cls2) 
-        {
-            int res = String.CASE_INSENSITIVE_ORDER.compare(cls1.getName(), cls2.getName());
-            if (res == 0) 
-            {
-                res = cls1.getName().compareTo(cls2.getName());
-            }
-            return res;
-        }
-    };
-
-    private static Comparator<String> ALPHABETICAL_ORDER_STRING = new Comparator<String>() 
-    {
-        public int compare(String cls1, String cls2) 
-        {
-            int res = String.CASE_INSENSITIVE_ORDER.compare(cls1, cls2);
-            if (res == 0) 
-            {
-                res = cls1.compareTo(cls2);
-            }
-            return res;
-        }
-    };
-}
\ No newline at end of file
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/_DNTypeManagerPatch.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/_DNTypeManagerPatch.java
deleted file mode 100644
index b7cc52a..0000000
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/_DNTypeManagerPatch.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  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.isis.persistence.jdo.datanucleus5.persistence;
-
-import java.util.Map;
-
-import javax.jdo.JDOHelper;
-import javax.jdo.PersistenceManagerFactory;
-
-import org.datanucleus.AbstractNucleusContext;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.datanucleus.metadata.PersistenceUnitMetaData;
-
-import org.apache.isis.commons.internal.reflection._Reflect;
-import org.apache.isis.core.runtime.context.IsisContext;
-
-import lombok.SneakyThrows;
-import lombok.val;
-
-/**
- * TODO remove once fixed upstream! (DN-core 5.2.5)
- * <p>
- * Patched from DN original in support of priority based type registration.
- * While documented, was never implemented.
- * <p>
- * See also
- * https://github.com/datanucleus/datanucleus-core/pull/360
- */
-@Deprecated
-public class _DNTypeManagerPatch {
-
-    public static PersistenceManagerFactory newPersistenceManagerFactory(Map<String, Object> datanucleusProps) {
-        
-        datanucleusProps.put(
-                "javax.jdo.PersistenceManagerFactoryClass", 
-                "org.apache.isis.persistence.jdo.datanucleus5.persistence._DNTypeManagerPatch$PersistenceManagerFactory2");
-        
-        val pmFactory =  JDOHelper.getPersistenceManagerFactory(datanucleusProps, IsisContext.getClassLoader());
-        
-        return pmFactory;
-    }
-
-    public static class PersistenceManagerFactory2 extends JDOPersistenceManagerFactory {
-        private static final long serialVersionUID = 1L;
-        
-        public PersistenceManagerFactory2(Map props) {
-            super(props);
-        }
-        
-        @Override @SneakyThrows
-        protected void initialiseMetaData(PersistenceUnitMetaData pumd) {
-            
-            val typeManager2 = new TypeManagerImpl2(nucleusContext);
-            val tmField = AbstractNucleusContext.class.getDeclaredField("typeManager");
-            
-            _Reflect.setFieldOn(tmField, nucleusContext, typeManager2);
-            
-            super.initialiseMetaData(pumd);
-        }
-        
-    }
-    
-}