[Git][java-team/eclipselink][upstream] New upstream version 2.6.6

Emmanuel Bourg gitlab at salsa.debian.org
Mon Dec 31 16:54:42 GMT 2018


Emmanuel Bourg pushed to branch upstream at Debian Java Maintainers / eclipselink


Commits:
975d838d by Emmanuel Bourg at 2018-12-31T11:48:19Z
New upstream version 2.6.6
- - - - -


23 changed files:

- META-INF/MANIFEST.MF
- OSGI-INF/l10n/bundle-src.properties
- org/eclipse/persistence/Version.j
- org/eclipse/persistence/Version.java
- org/eclipse/persistence/descriptors/DescriptorEventAdapter.java
- org/eclipse/persistence/descriptors/DescriptorEventListener.java
- org/eclipse/persistence/descriptors/DescriptorEventManager.java
- org/eclipse/persistence/expressions/ExpressionOperator.java
- org/eclipse/persistence/internal/descriptors/PersistenceObjectAttributeAccessor.java
- − org/eclipse/persistence/internal/helper/JDK15Platform.java
- − org/eclipse/persistence/internal/helper/JDK16Platform.java
- org/eclipse/persistence/internal/helper/JavaPlatform.java
- org/eclipse/persistence/internal/helper/JavaSEPlatform.java
- org/eclipse/persistence/internal/helper/JavaVersion.java
- org/eclipse/persistence/internal/jpa/EntityManagerFactoryDelegate.java
- org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java
- org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
- org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
- org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java
- org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java
- org/eclipse/persistence/internal/localization/i18n/LoggingLocalizationResource.java
- org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
- − org/eclipse/persistence/internal/weaving/WeaverLogger.java


Changes:

=====================================
META-INF/MANIFEST.MF
=====================================
@@ -1,11 +1,11 @@
 Manifest-Version: 1.0
-Ant-Version: Apache Ant 1.8.4
+Ant-Version: Apache Ant 1.9.6
 Created-By: 1.7.0_80-b15 (Oracle Corporation)
 Specification-Title: Eclipse Persistence Services Source
 Specification-Vendor: Eclipse.org - EclipseLink Project
-Specification-Version: 2.6.5
+Specification-Version: 2.6.6
 Implementation-Title: org.eclipse.persistence
 Implementation-Vendor: Eclipse.org - EclipseLink Project
-Implementation-Version: 2.6.5.v20170607-b3d05bd
-Release-Designation: EclipseLink 2.6.5
+Implementation-Version: 2.6.6.v20181219-80f4920114
+Release-Designation: EclipseLink 2.6.6
 


=====================================
OSGI-INF/l10n/bundle-src.properties
=====================================
@@ -1,4 +1,4 @@
 #Source Bundle Localization
-#Wed Jun 07 00:33:59 EDT 2017
+#Wed Dec 19 08:26:19 EST 2018
 bundleVendor=Eclipse.org - EclipseLink Project
 bundleName=EclipseLink Core Source


=====================================
org/eclipse/persistence/Version.j
=====================================
@@ -138,7 +138,6 @@ public class Version {
             case v1_8:
                 JDK_VERSION = JDK_1_8;
                 break;
-            case v1_9:
             case v9_0:
                 JDK_VERSION = JDK_1_9;
                 break;
@@ -229,7 +228,7 @@ public class Version {
      *         when we do not run on Java SE 1.9.
      */
     public static boolean isJDK19() {
-        return JavaSEPlatform.is(JavaSEPlatform.v9_0) || JavaSEPlatform.is(JavaSEPlatform.v1_9);
+        return JavaSEPlatform.is(JavaSEPlatform.v9_0);
     }
 
     public static void printVersion ( ) {


=====================================
org/eclipse/persistence/Version.java
=====================================
@@ -32,13 +32,13 @@ public class Version {
     // This will be used by all product components and included in exceptions.
     private static String product = "Eclipse Persistence Services";
     // A three part version number (major.minor.service)
-    private static final String version = "2.6.5";
+    private static final String version = "2.6.6";
     // A string that describes this build i.e.( vYYYYMMDD-HHMM, etc.)
-    private static final String qualifier = "v20170607-b3d05bd";
+    private static final String qualifier = "v20181219-80f4920114";
     // Should be in the format YYYYMMDD
-    private static final String buildDate = "20170607";
+    private static final String buildDate = "20181219";
     // Should be in the format HHMM
-    private static final String buildTime = "0028";
+    private static final String buildTime = "0826";
     // revision of source from the repository
     private static final String buildRevision = "NA";
     // Typically SNAPSHOT, Milestone name (M1,M2,etc), or RELEASE
@@ -138,7 +138,6 @@ public class Version {
             case v1_8:
                 JDK_VERSION = JDK_1_8;
                 break;
-            case v1_9:
             case v9_0:
                 JDK_VERSION = JDK_1_9;
                 break;
@@ -229,7 +228,7 @@ public class Version {
      *         when we do not run on Java SE 1.9.
      */
     public static boolean isJDK19() {
-        return JavaSEPlatform.is(JavaSEPlatform.v9_0) || JavaSEPlatform.is(JavaSEPlatform.v1_9);
+        return JavaSEPlatform.is(JavaSEPlatform.v9_0);
     }
 
     public static void printVersion ( ) {


=====================================
org/eclipse/persistence/descriptors/DescriptorEventAdapter.java
=====================================
@@ -1,21 +1,23 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
+/*******************************************************************************
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
  * and the Eclipse Distribution License is available at 
  * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Oracle - initial API and implementation from Oracle TopLink
- ******************************************************************************/  
-package org.eclipse.persistence.descriptors;
-
-import java.util.Vector;
-
-/**
- * <p><b>Purpose</b>: Provides an empty implementation of DescriptorEventListener.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation from Oracle TopLink
+ *     12/14/2017-2.6.6 Tomas Kraus
+ *       - 291546: Performance degradation due to usage of Vector in DescriptorEventManager
+ ******************************************************************************/
+package org.eclipse.persistence.descriptors;
+
+import java.util.List;
+
+/**
+ * <p><b>Purpose</b>: Provides an empty implementation of DescriptorEventListener.
  * Users who do not require the full DescritorEventListener API can subclass this class
  * and implement only the methods required.
  *
@@ -26,13 +28,14 @@ public class DescriptorEventAdapter implements DescriptorEventListener {
     public void aboutToInsert(DescriptorEvent event) {}
 
     public void aboutToUpdate(DescriptorEvent event) {}
-
-    public void aboutToDelete(DescriptorEvent event) {}
-
-    public boolean isOverriddenEvent(DescriptorEvent event, Vector eventManagers) {
-        return false;
-    }
-    
+
+    public void aboutToDelete(DescriptorEvent event) {}
+
+    @Override
+    public boolean isOverriddenEvent(DescriptorEvent event, List<DescriptorEventManager> eventManagers) {
+        return false;
+    }
+
     public void postBuild(DescriptorEvent event) {}
 
     public void postClone(DescriptorEvent event) {}


=====================================
org/eclipse/persistence/descriptors/DescriptorEventListener.java
=====================================
@@ -1,21 +1,24 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
+/*******************************************************************************
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
  * and the Eclipse Distribution License is available at 
  * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Oracle - initial API and implementation from Oracle TopLink
- ******************************************************************************/  
-package org.eclipse.persistence.descriptors;
-
-import java.util.*;
-
-/**
- * <p><b>Purpose</b>: Used to support Java event listener event model on descriptors.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation from Oracle TopLink
+ *     12/14/2017-2.6.6 Tomas Kraus
+ *       - 291546: Performance degradation due to usage of Vector in DescriptorEventManager
+ ******************************************************************************/
+package org.eclipse.persistence.descriptors;
+
+import java.util.EventListener;
+import java.util.List;
+
+/**
+ * <p><b>Purpose</b>: Used to support Java event listener event model on descriptors.
  * Events can be registered for, through two methods, the first is by providing a method
  * to be called on the object that a particular operation is being performed on.
  * The second is by registering an event listener object to be notified when any event occurs
@@ -31,125 +34,125 @@ public interface DescriptorEventListener extends EventListener {
     /**
      * This event is raised before an object is deleted from the database.
      * The object's row has already been built and is accessible from the event.
-     * This event can be used to amend an object's delete row.
-     */
-    // CR#2660080 was missing aboutToDelete
-    public void aboutToDelete(DescriptorEvent event);
-    
-    /**
-     * This event is raised before a new object is inserted to the database.
-     * The object's row has already been built and is accessible from the event.
-     * This event can be used to amend an object's insert row.
-     */
-    public void aboutToInsert(DescriptorEvent event);
-
-    /**
-     * This event is raised before an object is updated in the database.
+     * This event can be used to amend an object's delete row.
+     */
+    // CR#2660080 was missing aboutToDelete
+    void aboutToDelete(DescriptorEvent event);
+
+    /**
+     * This event is raised before a new object is inserted to the database.
+     * The object's row has already been built and is accessible from the event.
+     * This event can be used to amend an object's insert row.
+     */
+    void aboutToInsert(DescriptorEvent event);
+
+    /**
+     * This event is raised before an object is updated in the database.
      * This event is only raised for object's that have changes and will be updated.
-     * The object's row has already been built and is accessible from the event.
-     * This event can be used to amend an object's update row.
-     */
-    public void aboutToUpdate(DescriptorEvent event);
-
-    /**
-     * Implementers should define this method if they need or want to restrict 
-     * the calling of inherited events.
-     */
-     public boolean isOverriddenEvent(DescriptorEvent event, Vector eventManagers);
-     
-    /**
-     * This event is raised after an object is built from its row on a read operation.
-     * This event can be used to initialize non-persistent or non-mapped state in the object.
-     */
-    public void postBuild(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is cloned into a unit of work.
+     * The object's row has already been built and is accessible from the event.
+     * This event can be used to amend an object's update row.
+     */
+    void aboutToUpdate(DescriptorEvent event);
+
+    /**
+     * Implementers should define this method if they need or want to restrict
+     * the calling of inherited events.
+     */
+    boolean isOverriddenEvent(DescriptorEvent event, List<DescriptorEventManager> eventManagers);
+
+    /**
+     * This event is raised after an object is built from its row on a read operation.
+     * This event can be used to initialize non-persistent or non-mapped state in the object.
+     */
+    void postBuild(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is cloned into a unit of work.
      * This event can be used to initialize non-mapped state in the object.
-     * The event source/object is the unit of work clone,
-     * the event originalObject is the original object from the session cache.
-     */
-    public void postClone(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is deleted from the database.
-     */
-    public void postDelete(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is inserted to the database.
-     */
-    public void postInsert(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is merged from a unit of work into its parent.
+     * The event source/object is the unit of work clone,
+     * the event originalObject is the original object from the session cache.
+     */
+    void postClone(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is deleted from the database.
+     */
+    void postDelete(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is inserted to the database.
+     */
+    void postInsert(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is merged from a unit of work into its parent.
      * This event can be used to initialize non-mapped state in the parent object.
-     * The event source/object is the parent session object that was merged into,
-     * the event originalObject is the unit of work clone that was merged from.
-     */
-    public void postMerge(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is refreshed from its row on a refresh operation.
-     * This event can be used to initialize non-persistent or non-mapped state in the object.
-     */
-    public void postRefresh(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object updated in the database.
-     * This event is only raised for objects that had changes and were updated.
-     */
-    public void postUpdate(DescriptorEvent event);
-
-    /**
-     * This event is raised after an object is inserted or updated in the database.
-     * This event is only raised for new objects or objects that had changes and were updated.
-     */
-    public void postWrite(DescriptorEvent event);
-    
-    /**
-     * This event is raised before an object is deleted from the database.
-     */
-    public void preDelete(DescriptorEvent event);
-
-    /**
-     * This event is raised before an object is inserted to the database.
-     */
-    public void preInsert(DescriptorEvent event);
-
-    /**
-     * This event is only raised by the EntityManager.  It is raised when the
-     * create operation is initiated on an object.
-     */
-    public void prePersist(DescriptorEvent event);
-    
-    /**
-     * This event is raised when the remove operation is initiated on an object.
-     */
-    public void preRemove(DescriptorEvent event);
-    
-    /**
-     * This event is raised for all existing objects written or committed in a unit of work.
+     * The event source/object is the parent session object that was merged into,
+     * the event originalObject is the unit of work clone that was merged from.
+     */
+    void postMerge(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is refreshed from its row on a refresh operation.
+     * This event can be used to initialize non-persistent or non-mapped state in the object.
+     */
+    void postRefresh(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object updated in the database.
+     * This event is only raised for objects that had changes and were updated.
+     */
+    void postUpdate(DescriptorEvent event);
+
+    /**
+     * This event is raised after an object is inserted or updated in the database.
+     * This event is only raised for new objects or objects that had changes and were updated.
+     */
+    void postWrite(DescriptorEvent event);
+
+    /**
+     * This event is raised before an object is deleted from the database.
+     */
+    void preDelete(DescriptorEvent event);
+
+    /**
+     * This event is raised before an object is inserted to the database.
+     */
+    void preInsert(DescriptorEvent event);
+
+    /**
+     * This event is only raised by the EntityManager.  It is raised when the
+     * create operation is initiated on an object.
+     */
+    void prePersist(DescriptorEvent event);
+
+    /**
+     * This event is raised when the remove operation is initiated on an object.
+     */
+    void preRemove(DescriptorEvent event);
+
+    /**
+     * This event is raised for all existing objects written or committed in a unit of work.
      * This event is raised before the object's changes are computed,
-     * so the object may still be modified by the event.
-     * If the object has no changes, it will not be updated in a unit of work.
-     */
-    public void preUpdate(DescriptorEvent event);
-
-    /**
-     * This event is raised before an object is updated regardless if the object 
+     * so the object may still be modified by the event.
+     * If the object has no changes, it will not be updated in a unit of work.
+     */
+    void preUpdate(DescriptorEvent event);
+
+    /**
+     * This event is raised before an object is updated regardless if the object
      * has any database changes. This event was created to support EJB 3.0 
      * events. The object in this case will not have a row accessible from the 
-     * event. For objects that have database changes, an aboutToUpdate will also 
-     * be triggered.
-     */
-    public void preUpdateWithChanges(DescriptorEvent event);
-    
-    /**
-     * This event is raised for all new or existing objects written or committed in a unit of work.
+     * event. For objects that have database changes, an aboutToUpdate will also
+     * be triggered.
+     */
+    void preUpdateWithChanges(DescriptorEvent event);
+
+    /**
+     * This event is raised for all new or existing objects written or committed in a unit of work.
      * This event is raised before the object's changes are computed,
-     * so the object may still be modified by the event.
-     * If the object is existing and has no changes, it will not be updated in a unit of work.
-     */
-    public void preWrite(DescriptorEvent event);
-}
+     * so the object may still be modified by the event.
+     * If the object is existing and has no changes, it will not be updated in a unit of work.
+     */
+    void preWrite(DescriptorEvent event);
+}


=====================================
org/eclipse/persistence/descriptors/DescriptorEventManager.java
=====================================
@@ -1,33 +1,41 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
+/*******************************************************************************
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
  * and the Eclipse Distribution License is available at 
  * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Oracle - initial API and implementation from Oracle TopLink
- ******************************************************************************/  
-package org.eclipse.persistence.descriptors;
-
-import java.lang.reflect.*;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.util.*;
-import java.io.*;
-
-import org.eclipse.persistence.internal.helper.*;
-import org.eclipse.persistence.core.descriptors.CoreDescriptorEventManager;
-import org.eclipse.persistence.exceptions.*;
-import org.eclipse.persistence.sessions.SessionProfiler;
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
-
-/**
- * <p><b>Purpose</b>: The event manager allows for a descriptor to specify that 
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation from Oracle TopLink
+ *     12/14/2017-2.6.6 Tomas Kraus
+ *       - 291546: Performance degradation due to usage of Vector in DescriptorEventManager
+ ******************************************************************************/
+package org.eclipse.persistence.descriptors;
+
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicIntegerArray;
+import java.util.concurrent.atomic.AtomicReferenceArray;
+
+import org.eclipse.persistence.core.descriptors.CoreDescriptorEventManager;
+import org.eclipse.persistence.exceptions.DescriptorException;
+import org.eclipse.persistence.internal.helper.ClassConstants;
+import org.eclipse.persistence.internal.helper.Helper;
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
+import org.eclipse.persistence.internal.sessions.AbstractSession;
+import org.eclipse.persistence.sessions.SessionProfiler;
+
+/**
+ * <p><b>Purpose</b>: The event manager allows for a descriptor to specify that
  * an object should be notified when a EclipseLink event occurs.  It also determines 
  * how the object will be notified. To specify an event a method name can be 
  * registered to be called on the object when the event occurs. Events can be 
@@ -46,35 +54,35 @@ import org.eclipse.persistence.internal.sessions.AbstractSession;
  * </ul>
  *
  * @see ClassDescriptor
- */
-public class DescriptorEventManager extends CoreDescriptorEventManager<DescriptorEvent> implements Cloneable, Serializable {
-    protected ClassDescriptor descriptor;
-    protected Vector eventSelectors;
-    protected transient Vector eventMethods;
-    protected transient Vector eventListeners;
-    
-    // EJB 3.0 support for event listeners.
-    protected transient Vector defaultEventListeners;
-    protected transient Vector entityListenerEventListeners;
-    protected transient DescriptorEventListener entityEventListener;
-    /**
-     * Listeners that are fired after all other listeners are fired
-     */
-    protected transient List<DescriptorEventListener>  internalListeners = new ArrayList<DescriptorEventListener>();
-    
-    // EJB 3.0 support - cache our parent event managers.
-    protected transient Vector entityEventManagers;
-    protected transient Vector entityListenerEventManagers;
-    
-    // EJB 3.0 support for event listener configuration flags.
-    protected boolean excludeDefaultListeners;
-    protected boolean excludeSuperclassListeners;
-
-    //JPA project caching support.  Holds DescriptorEventListener representations for serialization/storage.
-    protected java.util.List<SerializableDescriptorEventHolder> descriptorEventHolders;
-
-    /** PERF: Cache if any events listener exist. */
-    protected boolean hasAnyEventListeners;
+ */
+public class DescriptorEventManager extends CoreDescriptorEventManager<DescriptorEvent> implements Cloneable, Serializable {
+    protected ClassDescriptor descriptor;
+    protected AtomicReferenceArray<String> eventSelectors;
+    protected transient AtomicReferenceArray<Method> eventMethods;
+    protected transient List<DescriptorEventListener> eventListeners;
+
+    // EJB 3.0 support for event listeners.
+    protected transient List<DescriptorEventListener> defaultEventListeners;
+    protected transient List<DescriptorEventListener> entityListenerEventListeners;
+    protected transient DescriptorEventListener entityEventListener;
+    /**
+     * Listeners that are fired after all other listeners are fired
+     */
+    protected transient List<DescriptorEventListener>  internalListeners = new ArrayList<>();
+
+    // EJB 3.0 support - cache our parent event managers.
+    protected transient List<DescriptorEventManager> entityEventManagers;
+    protected transient List<DescriptorEventManager> entityListenerEventManagers;
+
+    // EJB 3.0 support for event listener configuration flags.
+    protected boolean excludeDefaultListeners;
+    protected boolean excludeSuperclassListeners;
+
+    //JPA project caching support.  Holds DescriptorEventListener representations for serialization/storage.
+    protected List<SerializableDescriptorEventHolder> descriptorEventHolders;
+
+    /** PERF: Cache if any events listener exist. */
+    protected boolean hasAnyEventListeners;
     public static final int PreWriteEvent = 0;
     public static final int PostWriteEvent = 1;
     public static final int PreDeleteEvent = 2;
@@ -95,64 +103,60 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
     
     // EJB 3.0 events
     public static final int PrePersistEvent = 15;
-    public static final int PreRemoveEvent = 16;
-    public static final int PreUpdateWithChangesEvent = 17;
-
-   protected static final int NumberOfEvents = 18;
-    /**
-     * INTERNAL:
-     * Returns a new DescriptorEventManager for the specified ClassDescriptor.
-     */
-    public DescriptorEventManager() {
-        this.eventSelectors = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(NumberOfEvents);
-        this.eventMethods = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(NumberOfEvents);
-        this.hasAnyEventListeners = false;
-        this.excludeDefaultListeners = false;
-        this.excludeSuperclassListeners = false;
-
-        for (int index = 0; index < NumberOfEvents; index++) {
-            this.eventSelectors.addElement(null);
-            this.eventMethods.addElement(null);
-        }
-    }
-
-    /**
+    public static final int PreRemoveEvent = 16;
+    public static final int PreUpdateWithChangesEvent = 17;
+
+    protected static final int NumberOfEvents = 18;
+
+    /**
+     * INTERNAL:
+     * Returns a new DescriptorEventManager for the specified ClassDescriptor.
+     */
+    public DescriptorEventManager() {
+        this.eventSelectors = newAtomicReferenceArray(NumberOfEvents);
+        this.eventMethods = newAtomicReferenceArray(NumberOfEvents);
+        this.hasAnyEventListeners = false;
+        this.excludeDefaultListeners = false;
+        this.excludeSuperclassListeners = false;
+    }
+
+    /**
      * PUBLIC:
-     * EJB 3.0 support for default listeners.
-     */
-    public void addDefaultEventListener(DescriptorEventListener listener) {
-        getDefaultEventListeners().addElement(listener);
-    }
-    
-    /**
+     * EJB 3.0 support for default listeners.
+     */
+    public void addDefaultEventListener(DescriptorEventListener listener) {
+        getDefaultEventListeners().add(listener);
+    }
+
+    /**
      * PUBLIC:
      * EJB 3.0 support for lifecycle callback events defined on an entity 
-     * listener class.
-     */
-    public void addEntityListenerEventListener(DescriptorEventListener listener) {
-        getEntityListenerEventListeners().addElement(listener);
-    }
-
-    /**
+     * listener class.
+     */
+    public void addEntityListenerEventListener(DescriptorEventListener listener) {
+        getEntityListenerEventListeners().add(listener);
+    }
+
+    /**
      * PUBLIC:
      * Listener objects can be registered with the event manager to be notified 
-     * when an event occurs on any instance of the descriptor's class.
-     */
-    public void addListener(DescriptorEventListener listener) {
-        getEventListeners().addElement(listener);
-        setHasAnyEventListeners(true);
-    }
-
+     * when an event occurs on any instance of the descriptor's class.
+     */
+    public void addListener(DescriptorEventListener listener) {
+        getEventListeners().add(listener);
+        setHasAnyEventListeners(true);
+    }
+
     /**
      * INTERNAL:
      *
-     */
-    public void addInternalListener(DescriptorEventListener listener) {
-        if (internalListeners==null) {
-            internalListeners = new ArrayList<DescriptorEventListener>();
-        }
-        internalListeners.add(listener);
-        setHasAnyEventListeners(true); // ensure that events are generated
+     */
+    public void addInternalListener(DescriptorEventListener listener) {
+        if (internalListeners==null) {
+            internalListeners = new ArrayList<>();
+        }
+        internalListeners.add(listener);
+        setHasAnyEventListeners(true); // ensure that events are generated
     }
 
     /**
@@ -164,27 +168,24 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
     }
     
     /**
-     * INTERNAL:
-     * Clone the manager and its private parts.
-     */
-    public Object clone() {
-        DescriptorEventManager clone = null;
-
-        try {
-            clone = (DescriptorEventManager)super.clone();
-            clone.setEventSelectors((Vector)getEventSelectors().clone());
-            clone.setEventMethods((Vector)getEventMethods().clone());
-            clone.setEventListeners(getEventListeners());
-        } catch (Exception exception) {
-            ;
-        }
-
-        return clone;
-    }
-
-    /**
-     * INTERNAL:
-     * This method was added to allow JPA project caching so that DescriptorEventListeners could be 
+     * INTERNAL:
+     * Clone the manager and its private parts.
+     */
+    @Override
+    public Object clone() {
+        try {
+            DescriptorEventManager clone = (DescriptorEventManager)super.clone();
+            clone.setEventSelectors(newAtomicReferenceArray(getEventSelectors()));
+            clone.setEventMethods(newAtomicReferenceArray(getEventMethods()));
+            clone.setEventListeners(getEventListeners());
+            return clone;
+        } catch (Exception exception) {
+            throw new AssertionError(exception);
+        }
+    }
+    /**
+     * INTERNAL:
+     * This method was added to allow JPA project caching so that DescriptorEventListeners could be
      * serialized and re-added to the EventManager using a SerializableDescriptorEventHolder.
      * @param classLoader 
      */
@@ -231,13 +232,13 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
             if (event.getSource() instanceof DescriptorEventListener) {
                 // Allow the object itself to implement the interface.
                 notifyListener((DescriptorEventListener)event.getSource(), event);
-                return;
-            }
-
-            Method eventMethod = (Method)getEventMethods().elementAt(event.getEventCode());
-            if (eventMethod == null) {
-                return;
-            }
+                return;
+            }
+
+            Method eventMethod = (Method)getEventMethods().get(event.getEventCode());
+            if (eventMethod == null) {
+                return;
+            }
 
             // Now that I have the method, I need to invoke it
             try {
@@ -274,13 +275,13 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * DescriptorEvent as argument, Session is also supported as argument for 
      * backward compatibility.
      */
-    protected Method findMethod(int selector) throws DescriptorException {
-        Class[] declarationParameters = new Class[1];
-        declarationParameters[0] = ClassConstants.DescriptorEvent_Class;
-        String methodName = (String)getEventSelectors().elementAt(selector);
-
-        try {
-            return Helper.getDeclaredMethod(getDescriptor().getJavaClass(), methodName, declarationParameters);
+    protected Method findMethod(int selector) throws DescriptorException {
+        Class[] declarationParameters = new Class[1];
+        declarationParameters[0] = ClassConstants.DescriptorEvent_Class;
+        String methodName = getEventSelectors().get(selector);
+
+        try {
+            return Helper.getDeclaredMethod(getDescriptor().getJavaClass(), methodName, declarationParameters);
         } catch (NoSuchMethodException exception) {
             throw DescriptorException.noSuchMethodOnFindObsoleteMethod(methodName, getDescriptor(), exception);
         } catch (SecurityException exception) {
@@ -290,38 +291,37 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
 
     /**
      * INTERNAL:
-     * bug 251180 - Missing method org.eclipse.persistence.descriptors.DescriptorEventManager#setAboutToDeleteSelector 
-     */
-    public String getAboutToDeleteSelector() {
-        return (String)getEventSelectors().elementAt(AboutToDeleteEvent);
-    }
-
-    /**
-     * INTERNAL:
-     */
-    public String getAboutToInsertSelector() {
-        return (String)getEventSelectors().elementAt(AboutToInsertEvent);
-    }
-
-    /**
-     * INTERNAL:
-     */
-    public String getAboutToUpdateSelector() {
-        return (String)getEventSelectors().elementAt(AboutToUpdateEvent);
-    }
-
-    /**
-     * INTERNAL:
-     * EJB 3.0 support. Returns the default listeners.
-     */
-    public Vector getDefaultEventListeners() {
-        if (defaultEventListeners == null) {
-            defaultEventListeners = new NonSynchronizedVector();
-        }
-        
-        return defaultEventListeners;
-    }
-    
+     * bug 251180 - Missing method org.eclipse.persistence.descriptors.DescriptorEventManager#setAboutToDeleteSelector
+     */
+    public String getAboutToDeleteSelector() {
+        return (String)getEventSelectors().get(AboutToDeleteEvent);
+    }
+
+    /**
+     * INTERNAL:
+     */
+    public String getAboutToInsertSelector() {
+        return (String)getEventSelectors().get(AboutToInsertEvent);
+    }
+
+    /**
+     * INTERNAL:
+     */
+    public String getAboutToUpdateSelector() {
+        return (String)getEventSelectors().get(AboutToUpdateEvent);
+    }
+
+    /**
+     * INTERNAL:
+     * EJB 3.0 support. Returns the default listeners.
+     */
+    public List<DescriptorEventListener> getDefaultEventListeners() {
+        if (defaultEventListeners == null) {
+            defaultEventListeners = new CopyOnWriteArrayList<>();
+        }
+        return defaultEventListeners;
+    }
+
     /**
      * INTERNAL:
      */
@@ -331,25 +331,25 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
 
     /**
      * INTERNAL:
-     * used by JPA project caching to store DescriptorEventListener representations that can build the underlying 
-     * DescriptorEventListener and add it to the EventManager.
-     */
-    public java.util.List<SerializableDescriptorEventHolder> getDescriptorEventHolders() {
-        if (descriptorEventHolders == null) {
-            descriptorEventHolders = new java.util.ArrayList();
-        }
-        return descriptorEventHolders;
-    }
+     * used by JPA project caching to store DescriptorEventListener representations that can build the underlying
+     * DescriptorEventListener and add it to the EventManager.
+     */
+    public List<SerializableDescriptorEventHolder> getDescriptorEventHolders() {
+        if (descriptorEventHolders == null) {
+            descriptorEventHolders = new CopyOnWriteArrayList<>();
+        }
+        return descriptorEventHolders;
+    }
 
     /**
      * INTERNAL:
-     * used by JPA project caching to store DescriptorEventListener representations that can build the underlying 
-     * DescriptorEventListener and add it to the EventManager.
-     */
-    public void setDescriptorEventHolders(java.util.List<SerializableDescriptorEventHolder> descriptorEventHolders) {
-        this.descriptorEventHolders = descriptorEventHolders;
-    }
-
+     * used by JPA project caching to store DescriptorEventListener representations that can build the underlying
+     * DescriptorEventListener and add it to the EventManager.
+     */
+    public void setDescriptorEventHolders(List<SerializableDescriptorEventHolder> descriptorEventHolders) {
+        this.descriptorEventHolders = descriptorEventHolders;
+    }
+
     /**
      * INTERNAL:
      * EJB 3.0 support. Returns the entity event listener.
@@ -359,165 +359,158 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
     }
     
     /**
-     * INTERNAL:
-     * EJB 3.0 support. Returns the entity listener event listeners.
-     */
-    public Vector getEntityListenerEventListeners() {
-        if (entityListenerEventListeners == null) {
-            entityListenerEventListeners = new Vector();
-        }
-        
-        return entityListenerEventListeners;
-    }
-    
+     * INTERNAL:
+     * EJB 3.0 support. Returns the entity listener event listeners.
+     */
+    public List<DescriptorEventListener> getEntityListenerEventListeners() {
+        if (entityListenerEventListeners == null) {
+            entityListenerEventListeners = new CopyOnWriteArrayList<>();
+        }
+        return entityListenerEventListeners;
+    }
+
     /**
      * PUBLIC:
      * Returns the Listener objects that have been added.
-     *
-     * @see #addListener(DescriptorEventListener)
-     */
-    public Vector getEventListeners() {
-        // Lazy initialize to avoid unnecessary enumerations.
-        if (eventListeners == null) {
-            eventListeners = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(1);
-        }
-        return eventListeners;
-    }
-
-    protected Vector getEventMethods() {
-        //Lazy Initialized to prevent Null Pointer exception after serialization
-        if (this.eventMethods == null) {
-            this.eventMethods = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(NumberOfEvents);
-            for (int index = 0; index < NumberOfEvents; ++index) {
-                this.eventMethods.addElement(null);
-            }
-        }
-        return eventMethods;
-    }
-
-    protected Vector getEventSelectors() {
-        if (this.eventSelectors == null) {
-            this.eventSelectors = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(NumberOfEvents);
-            for (int index = 0; index < NumberOfEvents; ++index) {
-                this.eventSelectors.addElement(null);
-            }
-        }
-        return eventSelectors;
-    }
+     *
+     * @see #addListener(DescriptorEventListener)
+     */
+    public List<DescriptorEventListener> getEventListeners() {
+        // Lazy initialize to avoid unnecessary enumerations.
+        if (eventListeners == null) {
+            eventListeners = new CopyOnWriteArrayList<>();
+        }
+        return eventListeners;
+    }
+
+    protected AtomicReferenceArray<Method> getEventMethods() {
+        //Lazy Initialized to prevent Null Pointer exception after serialization
+        if (this.eventMethods == null) {
+            this.eventMethods = newAtomicReferenceArray(NumberOfEvents);
+        }
+        return eventMethods;
+    }
+
+    protected AtomicReferenceArray<String> getEventSelectors() {
+        if (this.eventSelectors == null) {
+            this.eventSelectors = newAtomicReferenceArray(NumberOfEvents);
+        }
+        return eventSelectors;
+    }
 
     /**
      * PUBLIC:
-     *  The name of the method called after an object is built
-     */
-    public String getPostBuildSelector() {
-        return (String)getEventSelectors().elementAt(PostBuildEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is built
+     */
+    public String getPostBuildSelector() {
+        return (String)getEventSelectors().get(PostBuildEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is cloned
-     */
-    public String getPostCloneSelector() {
-        return (String)getEventSelectors().elementAt(PostCloneEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is cloned
+     */
+    public String getPostCloneSelector() {
+        return (String)getEventSelectors().get(PostCloneEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is deleted
-     */
-    public String getPostDeleteSelector() {
-        return (String)getEventSelectors().elementAt(PostDeleteEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is deleted
+     */
+    public String getPostDeleteSelector() {
+        return (String)getEventSelectors().get(PostDeleteEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is inserted
-     */
-    public String getPostInsertSelector() {
-        return (String)getEventSelectors().elementAt(PostInsertEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is inserted
+     */
+    public String getPostInsertSelector() {
+        return (String)getEventSelectors().get(PostInsertEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is merged
-     */
-    public String getPostMergeSelector() {
-        return (String)getEventSelectors().elementAt(PostMergeEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is merged
+     */
+    public String getPostMergeSelector() {
+        return (String)getEventSelectors().get(PostMergeEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is refreshed
-     */
-    public String getPostRefreshSelector() {
-        return (String)getEventSelectors().elementAt(PostRefreshEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is refreshed
+     */
+    public String getPostRefreshSelector() {
+        return (String)getEventSelectors().get(PostRefreshEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is updated
-     */
-    public String getPostUpdateSelector() {
-        return (String)getEventSelectors().elementAt(PostUpdateEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is updated
+     */
+    public String getPostUpdateSelector() {
+        return (String)getEventSelectors().get(PostUpdateEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called after an object is written
-     */
-    public String getPostWriteSelector() {
-        return (String)getEventSelectors().elementAt(PostWriteEvent);
-    }
-
-    /**
+     *  The name of the method called after an object is written
+     */
+    public String getPostWriteSelector() {
+        return (String)getEventSelectors().get(PostWriteEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called before the create operation is applied to an object
-     */
-    public String getPrePersistSelector() {
-        return (String)getEventSelectors().elementAt(PrePersistEvent);
-    }
-
-  /**
+     *  The name of the method called before the create operation is applied to an object
+     */
+    public String getPrePersistSelector() {
+        return (String)getEventSelectors().get(PrePersistEvent);
+    }
+
+  /**
      * PUBLIC:
-     *  The name of the method called before an object is deleted
-     */
-    public String getPreDeleteSelector() {
-        return (String)getEventSelectors().elementAt(PreDeleteEvent);
-    }
-
-    /**
+     *  The name of the method called before an object is deleted
+     */
+    public String getPreDeleteSelector() {
+        return (String)getEventSelectors().get(PreDeleteEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called before an object is inserted
-     */
-    public String getPreInsertSelector() {
-        return (String)getEventSelectors().elementAt(PreInsertEvent);
-    }
-
-    /**
+     *  The name of the method called before an object is inserted
+     */
+    public String getPreInsertSelector() {
+        return (String)getEventSelectors().get(PreInsertEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called before the remove operation is applied to an object
-     */
-    public String getPreRemoveSelector() {
-        return (String)getEventSelectors().elementAt(PreRemoveEvent);
-    }
-
-  /**
+     *  The name of the method called before the remove operation is applied to an object
+     */
+    public String getPreRemoveSelector() {
+        return (String)getEventSelectors().get(PreRemoveEvent);
+    }
+
+  /**
      * PUBLIC:
-     *  The name of the method called before an object is updated
-     */
-    public String getPreUpdateSelector() {
-        return (String)getEventSelectors().elementAt(PreUpdateEvent);
-    }
-
-    /**
+     *  The name of the method called before an object is updated
+     */
+    public String getPreUpdateSelector() {
+        return (String)getEventSelectors().get(PreUpdateEvent);
+    }
+
+    /**
      * PUBLIC:
-     *  The name of the method called before an object is written
-     */
-    public String getPreWriteSelector() {
-        return (String)getEventSelectors().elementAt(PreWriteEvent);
-    }
-
-    /**
+     *  The name of the method called before an object is written
+     */
+    public String getPreWriteSelector() {
+        return (String)getEventSelectors().get(PreWriteEvent);
+    }
+
+    /**
      * INTERNAL:
      * Return if the event manager has any event listeners, or event methods.
      * If nothing is listening to event they can be avoided.
@@ -555,22 +548,22 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
     /** 
      * INTERNAL:
      * Internal event support.  Return true if this event manager has any internal 
-     * listener event listeners.
-     */
-    public boolean hasInternalEventListeners() {
-        return internalListeners != null && internalListeners.size() > 0;
-    }
-
-    /** 
+     * listener event listeners.
+     */
+    public boolean hasInternalEventListeners() {
+        return internalListeners != null && !internalListeners.isEmpty();
+    }
+
+    /**
      * INTERNAL:
      * EJB 3.0 support. Return true if this event manager has any entity 
-     * listener event listeners.
-     */
-    public boolean hasEntityListenerEventListeners() {
-        return entityListenerEventListeners != null && entityListenerEventListeners.size() > 0;
-    }
-
-    /**
+     * listener event listeners.
+     */
+    public boolean hasEntityListenerEventListeners() {
+        return entityListenerEventListeners != null && !entityListenerEventListeners.isEmpty();
+    }
+
+    /**
      * INTERNAL:
      * Configure inherited selectors.
      */
@@ -584,31 +577,32 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
         
         // Initialize if events are required at all.
         if (hasAnyListeners() || DescriptorEventListener.class.isAssignableFrom(getDescriptor().getJavaClass())) {
-            setHasAnyEventListeners(true);
-        }
-
-        for (int index = 0; index < NumberOfEvents; index++) {
-            if (getEventSelectors().elementAt(index) != null) {
-                setHasAnyEventListeners(true);
-                getEventMethods().setElementAt(findMethod(index), index);
-            }
-        }
-
+            setHasAnyEventListeners(true);
+        }
+
+        final AtomicReferenceArray<String> selectors = getEventSelectors();
+        for (int index = 0; index < NumberOfEvents; index++) {
+            if (selectors.get(index) != null) {
+                setHasAnyEventListeners(true);
+                getEventMethods().set(index, findMethod(index));
+            }
+        }
+
         // Inherit all parent defined event method
         // Do NOT inherit the listener as the events are broadcast to the parent.
         if (getDescriptor().isChildDescriptor()) {
             DescriptorEventManager parentEventManager = getDescriptor().getInheritancePolicy().getParentDescriptor().getEventManager();
             if (parentEventManager.hasAnyEventListeners()) {
                 setHasAnyEventListeners(true);                
-            }
-
-            for (int index = 0; index < NumberOfEvents; index++) {
-                if ((getEventSelectors().get(index) == null) && (parentEventManager.getEventSelectors().get(index) != null)) {
-                    setHasAnyEventListeners(true);
-                    getEventSelectors().set(index, parentEventManager.getEventSelectors().get(index));
-                    getEventMethods().set(index, parentEventManager.getEventMethods().get(index));
-                }
-            }            
+            }
+
+            for (int index = 0; index < NumberOfEvents; index++) {
+                if ((selectors.get(index) == null) && (parentEventManager.getEventSelectors().get(index) != null)) {
+                    setHasAnyEventListeners(true);
+                    selectors.set(index, parentEventManager.getEventSelectors().get(index));
+                    getEventMethods().set(index, parentEventManager.getEventMethods().get(index));
+                }
+            }
         }
     }
     
@@ -616,14 +610,14 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * INTERNAL:
      * EJB 3.0 support. Builds our chains of descriptor event managers that will 
      * need to be notified. The chains are cache so we only need to build them
-     * once.
-     */
-    protected void initializeEJB30EventManagers() {
-        entityEventManagers = new NonSynchronizedVector();
-        entityListenerEventManagers = new NonSynchronizedVector();
-             
-        if (hasEntityEventListener()) {
-            entityEventManagers.add(this);
+     * once.
+     */
+    protected void initializeEJB30EventManagers() {
+        entityEventManagers = new CopyOnWriteArrayList<>();
+        entityListenerEventManagers = new CopyOnWriteArrayList<>();
+
+        if (hasEntityEventListener()) {
+            entityEventManagers.add(this);
         }
         
         if (hasEntityListenerEventListeners()) {
@@ -664,24 +658,24 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
                 notifyListener(listener, event);
             }
         }
-
-        // Step 2 - Notify the Entity Listener's first, top -> down.
-        for (int index = entityListenerEventManagers.size() - 1; index >= 0; index--) {
-            Vector entityListenerEventListeners = ((DescriptorEventManager) entityListenerEventManagers.get(index)).getEntityListenerEventListeners();
-                 
-            for (int i = 0; i < entityListenerEventListeners.size(); i++) {
-                DescriptorEventListener listener = (DescriptorEventListener) entityListenerEventListeners.get(i);
+
+        // Step 2 - Notify the Entity Listener's first, top -> down.
+        for (int index = entityListenerEventManagers.size() - 1; index >= 0; index--) {
+            List entityListenerEventListeners = ((DescriptorEventManager) entityListenerEventManagers.get(index)).getEntityListenerEventListeners();
+
+            for (int i = 0; i < entityListenerEventListeners.size(); i++) {
+                DescriptorEventListener listener = (DescriptorEventListener) entityListenerEventListeners.get(i);
                 notifyListener(listener, event);
             }
         }
 
-        // Step 3 - Notify the Entity event listeners. top -> down, unless
-        // they are overridden in a subclass.
-        for (int index = entityEventManagers.size() - 1; index >= 0; index--) {
-            DescriptorEventListener entityEventListener = ((DescriptorEventManager) entityEventManagers.get(index)).getEntityEventListener();
-
-            if (! entityEventListener.isOverriddenEvent(event, entityEventManagers)) {
-                notifyListener(entityEventListener, event);
+        // Step 3 - Notify the Entity event listeners. top -> down, unless
+        // they are overridden in a subclass.
+        for (int index = entityEventManagers.size() - 1; index >= 0; index--) {
+            DescriptorEventListener entityEventListener = entityEventManagers.get(index).getEntityEventListener();
+
+            if (! entityEventListener.isOverriddenEvent(event, entityEventManagers)) {
+                notifyListener(entityEventListener, event);
             }
         }
 
@@ -778,65 +772,60 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
 
     /**
      * INTERNAL:
-     * Used to initialize a remote DescriptorEventManager.
-     */
-    public void remoteInitialization(AbstractSession session) {
-        this.eventMethods = new Vector(NumberOfEvents);
-
-        for (int index = 0; index < NumberOfEvents; index++) {
-            this.eventMethods.addElement(null);
-        }
-
-        initialize(session);
-    }
-
+     * Used to initialize a remote DescriptorEventManager.
+     */
+    public void remoteInitialization(AbstractSession session) {
+        this.eventMethods = newAtomicReferenceArray(NumberOfEvents);
+        initialize(session);
+    }
+
     /**
      * PUBLIC:
-     * Remove a event listener.
-     */
-    public void removeListener(DescriptorEventListener listener) {
-        getEventListeners().removeElement(listener);
-    }
-    
-    /**
+     * Remove a event listener.
+     */
+    public void removeListener(DescriptorEventListener listener) {
+        getEventListeners().remove(listener);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called when an object's row it about to 
      * be inserted. This uses the optional event argument of the DatabaseRow.
      * This is different from pre/postInsert because it occurs after the row has 
      * already been built. This event can be used to modify the row before 
      * insert, such as adding a user inserted by.
-     */
-    //bug 251180: Missing method org.eclipse.persistence.descriptors.DescriptorEventManager#setAboutToDeleteSelector 
-    public void setAboutToDeleteSelector(String aboutToDeleteSelector) {
-        getEventSelectors().setElementAt(aboutToDeleteSelector, AboutToDeleteEvent);
-    }
-
-    /**
+     */
+    //bug 251180: Missing method org.eclipse.persistence.descriptors.DescriptorEventManager#setAboutToDeleteSelector
+    public void setAboutToDeleteSelector(String aboutToDeleteSelector) {
+        getEventSelectors().set(AboutToDeleteEvent, aboutToDeleteSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called when an object's row it about to 
      * be inserted. This uses the optional event argument of the DatabaseRow.
      * This is different from pre/postInsert because it occurs after the row has 
      * already been built. This event can be used to modify the row before 
-     * insert, such as adding a user inserted by.
-     */
-    public void setAboutToInsertSelector(String aboutToInsertSelector) {
-        getEventSelectors().setElementAt(aboutToInsertSelector, AboutToInsertEvent);
-    }
-
-    /**
+     * insert, such as adding a user inserted by.
+     */
+    public void setAboutToInsertSelector(String aboutToInsertSelector) {
+        getEventSelectors().set(AboutToInsertEvent, aboutToInsertSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called when an object's row it about to 
      * be updated. This uses the optional event argument of the DatabaseRow.
      * This is different from pre/postUpdate because it occurs after the row has 
      * already been built, and it ONLY called if the update is required (changed 
      * within a unit of work), as the other occur ALWAYS. This event can be used 
-     * to modify the row before insert, such as adding a user inserted by.
-     */
-    public void setAboutToUpdateSelector(String aboutToUpdateSelector) {
-        getEventSelectors().setElementAt(aboutToUpdateSelector, AboutToUpdateEvent);
-    }
-
-    /**
+     * to modify the row before insert, such as adding a user inserted by.
+     */
+    public void setAboutToUpdateSelector(String aboutToUpdateSelector) {
+        getEventSelectors().set(AboutToUpdateEvent, aboutToUpdateSelector);
+    }
+
+    /**
      * INTERNAL:
      * Set the descriptor.
      */
@@ -849,24 +838,28 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * EJB 3.0 support for lifecycle callback events defined on an entity class.
      */
     public void setEntityEventListener(DescriptorEventListener listener) {
-        this.entityEventListener = listener;
-    }
-
-    protected void setEventListeners(Vector eventListeners) {
-        this.eventListeners = eventListeners;
-    }
-
-    protected void setEventMethods(Vector eventMethods) {
-        this.eventMethods = eventMethods;
-    }
-
-    protected void setEventSelectors(Vector eventSelectors) {
-        this.eventSelectors = eventSelectors;
-    }
-    
-    /**
-     * INTERNAL:
-     * EJB 3.0 support. Default listeners apply to all entities in a persistence 
+        this.entityEventListener = listener;
+    }
+
+    protected void setEventListeners(List<DescriptorEventListener> eventListeners) {
+        if (eventListeners instanceof CopyOnWriteArrayList) {
+            this.eventListeners = eventListeners;
+        } else {
+            this.eventListeners = new CopyOnWriteArrayList(eventListeners);
+        }
+    }
+
+    protected void setEventMethods(AtomicReferenceArray<Method> eventMethods) {
+        this.eventMethods = eventMethods;
+    }
+
+    protected void setEventSelectors(AtomicReferenceArray<String> eventSelectors) {
+        this.eventSelectors = eventSelectors;
+    }
+
+    /**
+     * INTERNAL:
+     * EJB 3.0 support. Default listeners apply to all entities in a persistence
      * unit. Set this flag to true to exclude the invocation of the default 
      * listeners for this descriptor.
      */
@@ -901,78 +894,78 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * built from the database. This uses the optional event argument for the 
      * DatabaseRow. This event can be used to correctly initialize an object's 
      * non-persistent attributes or to perform complex optimizations or 
-     * mappings. This event is called whenever an object is built.
-     */
-    public void setPostBuildSelector(String postBuildSelector) {
-        getEventSelectors().setElementAt(postBuildSelector, PostBuildEvent);
-    }
-
-    /**
+     * mappings. This event is called whenever an object is built.
+     */
+    public void setPostBuildSelector(String postBuildSelector) {
+        getEventSelectors().set(PostBuildEvent, postBuildSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * cloned into a unit of work. This uses the optional event argument for the 
      * original object (the source object is the clone). This event can be used 
-     * to correctly initialize an object's non-persistent attributes.
-     */
-    public void setPostCloneSelector(String postCloneSelector) {
-        getEventSelectors().setElementAt(postCloneSelector, PostCloneEvent);
-    }
-
-    /**
+     * to correctly initialize an object's non-persistent attributes.
+     */
+    public void setPostCloneSelector(String postCloneSelector) {
+        getEventSelectors().set(PostCloneEvent, postCloneSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * deleted from the database. This event can notify/remove any dependents 
-     * on the object.
-     */
-    public void setPostDeleteSelector(String postDeleteSelector) {
-        getEventSelectors().setElementAt(postDeleteSelector, PostDeleteEvent);
-    }
-
-    /**
+     * on the object.
+     */
+    public void setPostDeleteSelector(String postDeleteSelector) {
+        getEventSelectors().set(PostDeleteEvent, postDeleteSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * inserted into the database. This event can be used to notify any 
      * dependent on the object, or to update information not accessible until 
-     * the object has been inserted.
-     */
-    public void setPostInsertSelector(String postInsertSelector) {
-        getEventSelectors().setElementAt(postInsertSelector, PostInsertEvent);
-    }
-
-    /**
+     * the object has been inserted.
+     */
+    public void setPostInsertSelector(String postInsertSelector) {
+        getEventSelectors().set(PostInsertEvent, postInsertSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * merge from a unit of work. This uses the optional event argument of the 
      * original object which is the object being merged from, the source object 
      * is the object being merged into. This event can be used to correctly 
-     * initialize an object's non-persistent attributes.
-     */
-    public void setPostMergeSelector(String postMergeSelector) {
-        getEventSelectors().setElementAt(postMergeSelector, PostMergeEvent);
-    }
-
-    /**
+     * initialize an object's non-persistent attributes.
+     */
+    public void setPostMergeSelector(String postMergeSelector) {
+        getEventSelectors().set(PostMergeEvent, postMergeSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * refreshed from the database. This uses the optional event argument of 
      * the DatabaseRow. This event can be used to correctly initialize an 
      * object's non-persistent attributes or to perform complex optimizations or 
-     * mappings. This event is only called on refreshes of existing objects.
-     */
-    public void setPostRefreshSelector(String postRefreshSelector) {
-        getEventSelectors().setElementAt(postRefreshSelector, PostRefreshEvent);
-    }
-
-    /**
+     * mappings. This event is only called on refreshes of existing objects.
+     */
+    public void setPostRefreshSelector(String postRefreshSelector) {
+        getEventSelectors().set(PostRefreshEvent, postRefreshSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
-     * updated into the database.
-     */
-    public void setPostUpdateSelector(String postUpdateSelector) {
-        getEventSelectors().setElementAt(postUpdateSelector, PostUpdateEvent);
-    }
-
-    /**
+     * updated into the database.
+     */
+    public void setPostUpdateSelector(String postUpdateSelector) {
+        getEventSelectors().set(PostUpdateEvent, postUpdateSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that has just been 
      * written to the database. This event is raised on any registered object 
@@ -980,65 +973,65 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * "aboutToUpdate" selector if it is required for the event to be raised 
      * only when the object has been changed. This will be called on all inserts 
      * and updates, after the "postInsert/Update" event has been raised. This 
-     * event can be used to notify any dependent on the object.
-     */
-    public void setPostWriteSelector(String postWriteSelector) {
-        getEventSelectors().setElementAt(postWriteSelector, PostWriteEvent);
-    }
-
-    /**
+     * event can be used to notify any dependent on the object.
+     */
+    public void setPostWriteSelector(String postWriteSelector) {
+        getEventSelectors().set(PostWriteEvent, postWriteSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that is going to be 
      * deleted from the database. This event can notify/remove any dependents 
-     * on the object.
-     */
-    public void setPreDeleteSelector(String preDeleteSelector) {
-        getEventSelectors().setElementAt(preDeleteSelector, PreDeleteEvent);
-    }
-
-    /**
+     * on the object.
+     */
+    public void setPreDeleteSelector(String preDeleteSelector) {
+        getEventSelectors().set(PreDeleteEvent, preDeleteSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that is going to be 
      * inserted into the database. This event can be used to notify any 
      * dependent on the object or acquire the object's id through a custom 
-     * mechanism.
-     */
-    public void setPreInsertSelector(String preInsertSelector) {
-        getEventSelectors().setElementAt(preInsertSelector, PreInsertEvent);
-    }
-    
-    /**
+     * mechanism.
+     */
+    public void setPreInsertSelector(String preInsertSelector) {
+        getEventSelectors().set(PreInsertEvent, preInsertSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object when that object has 
-     * the create operation applied to it.
-     */
-    public void setPrePersistSelector(String prePersistSelector) {
-        getEventSelectors().setElementAt(prePersistSelector, PrePersistEvent);
-    }
-
-    /**
+     * the create operation applied to it.
+     */
+    public void setPrePersistSelector(String prePersistSelector) {
+        getEventSelectors().set(PrePersistEvent, prePersistSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object when that object has 
-     * the remove operation applied to it.
-     */
-    public void setPreRemoveSelector(String preRemoveSelector) {
-        getEventSelectors().setElementAt(preRemoveSelector, PreRemoveEvent);
-    }
-
-    /**
+     * the remove operation applied to it.
+     */
+    public void setPreRemoveSelector(String preRemoveSelector) {
+        getEventSelectors().set(PreRemoveEvent, preRemoveSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that is going to be 
      * updated into the database. This event is raised on any registered object 
      * in a unit of work, even if it has not changed, refer to the 
      * "aboutToUpdate" selector if it is required for the event to be raised 
      * only when the object has been changed. This event can be used to notify 
-     * any dependent on the object.
-     */
-    public void setPreUpdateSelector(String preUpdateSelector) {
-        getEventSelectors().setElementAt(preUpdateSelector, PreUpdateEvent);
-    }
-
-    /**
+     * any dependent on the object.
+     */
+    public void setPreUpdateSelector(String preUpdateSelector) {
+        getEventSelectors().set(PreUpdateEvent, preUpdateSelector);
+    }
+
+    /**
      * PUBLIC:
      * A method can be registered to be called on a object that is going to be 
      * written to the database. This event is raised on any registered object 
@@ -1046,9 +1039,35 @@ public class DescriptorEventManager extends CoreDescriptorEventManager<Descripto
      * "aboutToUpdate" selector if it is required for the event to be raised 
      * only when the object has been changed. This will be called on all inserts 
      * and updates, before the "preInsert/Update" event has been raised. This 
-     * event can be used to notify any dependent on the object.
-     */
-    public void setPreWriteSelector(String preWriteSelector) {
-        getEventSelectors().setElementAt(preWriteSelector, PreWriteEvent);
-    }
-}
+     * event can be used to notify any dependent on the object.
+     */
+    public void setPreWriteSelector(String preWriteSelector) {
+        getEventSelectors().set(PreWriteEvent, preWriteSelector);
+    }
+
+    /**
+     * Create an instance of {@link AtomicIntegerArray} initialized with {@code NullEvent} values.
+     *
+     * @param length length of the array.
+     * @return initialized instance of {@link AtomicIntegerArray}
+     */
+    private static <T> AtomicReferenceArray<T> newAtomicReferenceArray(final int length) {
+        final AtomicReferenceArray array = new AtomicReferenceArray<>(length);
+        for (int index = 0; index < length; array.set(index++, null));
+        return (AtomicReferenceArray<T>)array;
+    }
+
+    /**
+     * Create an instance of {@link AtomicIntegerArray} initialized with content of provided array.
+     *
+     * @param src source array.
+     * @return initialized instance of {@link AtomicIntegerArray}
+     */
+    private static <T> AtomicReferenceArray<T> newAtomicReferenceArray(final AtomicReferenceArray<T> src) {
+        final int length = src.length();
+        final AtomicReferenceArray array = new AtomicReferenceArray<>(length);
+        for (int index = 0; index < length; array.set(index, src.get(index++)));
+        return (AtomicReferenceArray<T>)array;
+    }
+
+}


=====================================
org/eclipse/persistence/expressions/ExpressionOperator.java
=====================================
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2018 Oracle and/or its affiliates. All rights reserved.
  * This program and the accompanying materials are made available under the 
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
  * which accompanies this distribution. 
@@ -12,6 +12,8 @@
  *     Markus Karg - allow arguments to be specified multiple times in argumentIndices
  *     05/07/2009-1.1.1 Dave Brosius 
  *       - 263904: [PATCH] ExpressionOperator doesn't compare arrays correctly
+ *     01/23/2018-2.6 Will Dazey
+ *       - 530214: trim operation should not bind parameters
  ******************************************************************************/  
 package org.eclipse.persistence.expressions;
 
@@ -3041,6 +3043,7 @@ public class ExpressionOperator implements Serializable {
         exOperator.printsAs(v);
         exOperator.bePrefix();
         exOperator.setNodeClass(ClassConstants.FunctionExpression_Class);
+        exOperator.setIsBindingSupported(false);
         return exOperator;
     }
 


=====================================
org/eclipse/persistence/internal/descriptors/PersistenceObjectAttributeAccessor.java
=====================================
@@ -12,56 +12,21 @@
  ******************************************************************************/
 package org.eclipse.persistence.internal.descriptors;
 
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-
 import org.eclipse.persistence.exceptions.DescriptorException;
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetClassLoaderForClass;
-import org.eclipse.persistence.internal.security.PrivilegedGetClassLoaderFromCurrentThread;
-import org.eclipse.persistence.internal.weaving.WeaverLogger;
-import org.eclipse.persistence.logging.SessionLog;
 
 /**
  * Used with weaving to access attributes without using reflection.
  */
 public class PersistenceObjectAttributeAccessor extends InstanceVariableAttributeAccessor {
 
-    /** Cache logger finest level settings. */
-    private final boolean shouldLogFinest;
-
     public PersistenceObjectAttributeAccessor(String attributeName) {
         this.attributeName = attributeName.intern();
-        // PERF: Cache weaver logger finest level settings. It won't allow to change logger settings on the fly
-        // but it's less evil than evaluating it with every single getter/setter call.
-        shouldLogFinest = WeaverLogger.shouldLog(SessionLog.FINEST);
     }
 
     /**
      * Returns the value of the attribute on the specified object.
      */
     public Object getAttributeValueFromObject(Object object) {
-        if (shouldLogFinest) {
-            ClassLoader contextClassLoader;
-            ClassLoader objectClassLoader;
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                try {
-                    contextClassLoader = AccessController.doPrivileged(
-                            new PrivilegedGetClassLoaderFromCurrentThread());
-                    objectClassLoader = AccessController.doPrivileged(
-                            new PrivilegedGetClassLoaderForClass(object.getClass()));
-                } catch (PrivilegedActionException ex) {
-                    throw (RuntimeException) ex.getCause();
-                }
-            } else {
-                contextClassLoader = Thread.currentThread().getContextClassLoader();
-                objectClassLoader = object.getClass().getClassLoader();
-            }
-            WeaverLogger.log(SessionLog.FINEST, "weaving_call_persistence_get",
-                    object.getClass().getName(),
-                            Integer.toHexString(System.identityHashCode(contextClassLoader)),
-                            Integer.toHexString(System.identityHashCode(objectClassLoader)));
-        }
         return ((PersistenceObject)object)._persistence_get(this.attributeName);
     }
 
@@ -78,27 +43,6 @@ public class PersistenceObjectAttributeAccessor extends InstanceVariableAttribut
      * Sets the value of the instance variable in the object to the value.
      */
     public void setAttributeValueInObject(Object object, Object value) {
-        if (shouldLogFinest) {
-            ClassLoader contextClassLoader;
-            ClassLoader objectClassLoader;
-            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                try {
-                    contextClassLoader = AccessController.doPrivileged(
-                            new PrivilegedGetClassLoaderFromCurrentThread());
-                    objectClassLoader = AccessController.doPrivileged(
-                            new PrivilegedGetClassLoaderForClass(object.getClass()));
-                } catch (PrivilegedActionException ex) {
-                    throw (RuntimeException) ex.getCause();
-                }
-            } else {
-                contextClassLoader = Thread.currentThread().getContextClassLoader();
-                objectClassLoader = object.getClass().getClassLoader();
-            }
-            WeaverLogger.log(SessionLog.FINEST, "weaving_call_persistence_set",
-                    object.getClass().getName(),
-                    Integer.toHexString(System.identityHashCode(contextClassLoader)),
-                    Integer.toHexString(System.identityHashCode(objectClassLoader)));
-        }
         ((PersistenceObject)object)._persistence_set(this.attributeName, value);
     }
 }


=====================================
org/eclipse/persistence/internal/helper/JDK15Platform.java deleted
=====================================
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at 
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Oracle - initial API and implementation from Oracle TopLink
- ******************************************************************************/  
-package org.eclipse.persistence.internal.helper;
-
-import java.sql.SQLException;
-import java.util.regex.Pattern;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- *  INTERNAL:
- *  Implements operations specific to JDK 1.5
- */
-public class JDK15Platform implements JDKPlatform {
-
-    /**
-     * PERF: The like expression compiled Pattern objects are cached
-     * to avoid re-compilation on every usage.
-     */
-    protected static ConcurrentHashMap patternCache = new ConcurrentHashMap();
-
-    /**
-     * PERF: The regular expression compiled Pattern objects are cached
-     * to avoid re-compilation on every usage.
-     */
-    protected static ConcurrentHashMap regexpPatternCache = new ConcurrentHashMap();
-
-    /**
-     * INTERNAL:
-     * An implementation of in memory queries with Like which uses the
-     * regular expression framework.
-     */
-    public Boolean conformLike(Object left, Object right) {
-        if ((left == null) && (right == null)) {
-            return Boolean.TRUE;
-        } else if ((left == null) || (right == null)) {
-            return Boolean.FALSE;
-        }
-        left = String.valueOf(left);
-        right = String.valueOf(right);
-        // PERF: First check the pattern cache for the pattern.
-        // Note that the original string is the key, to avoid having to translate it first.
-        Pattern pattern = (Pattern)patternCache.get(right);
-        if (pattern == null) {
-            // Bug 3936427 - Replace regular expression reserved characters with escaped version of those characters
-            // For instance replace ? with \?
-            String convertedRight = Helper.convertLikeToRegex((String)right);
-
-            pattern = Pattern.compile(convertedRight);
-            // Ensure cache does not grow beyond 100.
-            if (patternCache.size() > 100) {
-                patternCache.remove(patternCache.keySet().iterator().next());
-            }
-            patternCache.put(right, pattern);
-        }
-        boolean match = pattern.matcher((String)left).matches();
-        if (match) {
-            return Boolean.TRUE;
-        } else {
-            return Boolean.FALSE;
-        }
-    }
-    
-    /**
-     * INTERNAL:
-     * An implementation of in memory queries with Regexp which uses the
-     * regular expression framework.
-     */
-    public Boolean conformRegexp(Object left, Object right) {
-        if ((left == null) && (right == null)) {
-            return Boolean.TRUE;
-        } else if ((left == null) || (right == null)) {
-            return Boolean.FALSE;
-        }
-        left = String.valueOf(left);
-        right = String.valueOf(right);
-        // PERF: First check the pattern cache for the pattern.
-        // Note that the original string is the key, to avoid having to translate it first.
-        Pattern pattern = (Pattern)regexpPatternCache.get(right);
-        if (pattern == null) {
-            pattern = Pattern.compile((String)right);
-            // Ensure cache does not grow beyond 100.
-            if (regexpPatternCache.size() > 100) {
-                regexpPatternCache.remove(regexpPatternCache.keySet().iterator().next());
-            }
-            regexpPatternCache.put(right, pattern);
-        }
-        boolean match = pattern.matcher((String)left).matches();
-        if (match) {
-            return Boolean.TRUE;
-        } else {
-            return Boolean.FALSE;
-        }
-    }
-    
-    /**
-     * Indicates whether the passed object implements java.sql.SQLXML introduced in jdk 1.6
-     */
-    public boolean isSQLXML(Object object) {
-        return false;
-    }
-
-    /**
-     * Casts the passed object to SQLXML and calls getString and free methods
-     */
-    public String getStringAndFreeSQLXML(Object sqlXml) throws SQLException { 
-        return null;
-    }
-}


=====================================
org/eclipse/persistence/internal/helper/JDK16Platform.java deleted
=====================================
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at 
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     ailitchev - 2010/08/19
- *          Bug 322960 - TWO TESTS IN CUSTOMFEATURESJUNITTESTSUITE FAILED WITH 11.2.0.2 DRIVER 
- ******************************************************************************/  
-package org.eclipse.persistence.internal.helper;
-
-import java.sql.SQLException;
-import java.sql.SQLXML;
-
-/**
- *  INTERNAL:
- *  Implements operations specific to JDK 1.6
- */
-public class JDK16Platform extends JDK15Platform {
-
-    /**
-     * Indicates whether the passed object implements java.sql.SQLXML introduced in jdk 1.6
-     */
-    public boolean isSQLXML(Object object) {
-        return (object instanceof SQLXML);
-    }
-
-    /**
-     * Casts the passed object to SQLXML and calls getString and free methods
-     */
-    public String getStringAndFreeSQLXML(Object sqlXml) throws SQLException { 
-        String str = ((SQLXML)sqlXml).getString();
-        ((SQLXML)sqlXml).free();
-        return str;
-    }
-}


=====================================
org/eclipse/persistence/internal/helper/JavaPlatform.java
=====================================
@@ -1,105 +1,122 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at 
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     Oracle - initial API and implementation from Oracle TopLink
- ******************************************************************************/  
-package org.eclipse.persistence.internal.helper;
-
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.sql.SQLException;
-
-import org.eclipse.persistence.Version;
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
-import org.eclipse.persistence.internal.security.PrivilegedClassForName;
-
-/**
- *  INTERNAL:
- *  JavaPlatform abstracts the version of the JDK we are using.  It allows any operation
- *  which is dependent on JDK version to be called from a single place and then delegates
- *  the call to its JDKPlatform
- *  @see JDPlatform
- *  @author Tom Ware
- */
-public class JavaPlatform {
-    protected static JDKPlatform platform = null;
-
-    /**
-     *  INTERNAL:
-     *  Get the version of JDK being used from the Version class.
-     *  @return JDKPlatform a platform appropriate for the version of JDK being used.
+/*******************************************************************************
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * Contributors:
+ *     Oracle - initial API and implementation from Oracle TopLink
+ *     ailitchev - 2010/08/19
+ *          Bug 322960 - TWO TESTS IN CUSTOMFEATURESJUNITTESTSUITE FAILED WITH 11.2.0.2 DRIVER
+ *     Tomas Kraus - 2017/10/11
+ *          Bug 525854 - Fix Java SE platform detection and clean up platform code
+ ******************************************************************************/
+package org.eclipse.persistence.internal.helper;
+
+import java.sql.SQLException;
+import java.sql.SQLXML;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
+
+/**
+ *  INTERNAL:
+ *  JavaPlatform abstracts the version of the JDK we are using.  It allows any operation
+ *  which is dependent on JDK version to be called from a single place and then delegates
+ *  the call to its JDKPlatform
+ *  @see JDPlatform
+ *  @author Tom Ware
+ */
+public class JavaPlatform {
+
+    /**
+     * PERF: The like expression compiled Pattern objects are cached
+     * to avoid re-compilation on every usage.
      */
-    protected static JDKPlatform getPlatform() {
-        if (platform == null) {
-            if (JavaSEPlatform.CURRENT.atLeast(JavaSEPlatform.v1_6)) {
-                try {
-                    Class platformClass = null;
-                    // use class.forName() to avoid loading the JDK 1.6 class unless it is needed.
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try {
-                            platformClass = AccessController.doPrivileged(new PrivilegedClassForName("org.eclipse.persistence.internal.helper.JDK16Platform"));
-                        } catch (PrivilegedActionException exception) {
-                        }
-                    } else {
-                        platformClass = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.internal.helper.JDK16Platform");
-                    }                  
-                    if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        try {
-                            platform = (JDKPlatform)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(platformClass));
-                        } catch (PrivilegedActionException exception) {
-                        }
-                    } else {
-                        platform = (JDKPlatform)PrivilegedAccessHelper.newInstanceFromClass(platformClass);
-                    }      
-                } catch (Exception exception) {
-                }
-            }
-            if (platform == null) {
-                platform = new JDK15Platform();
-            }
-        }
-        return platform;
-    }
-
-    /**
-     *  INTERNAL:
-     *  Conform an expression which uses the operator "like" for an in-memory query
-     *  @return Boolean (TRUE, FALSE, null == unknown)
-     */
-    public static Boolean conformLike(Object left, Object right) {
-        return getPlatform().conformLike(left, right);
-    }
-
-    /**
-     *  INTERNAL:
-     *  Conform an expression which uses the operator "regexp" for an in-memory query
-     *  @return Boolean (TRUE, FALSE, null == unknown)
-     */
-    public static Boolean conformRegexp(Object left, Object right) {
-        return getPlatform().conformRegexp(left, right);
-    }
-
-    /**
-     * INTERNAL:
-     * Indicates whether the passed object implements java.sql.SQLXML introduced in jdk 1.6
-     */
-    public static boolean isSQLXML(Object object) {
-        return getPlatform().isSQLXML(object);
-    }
-
-    /**
-     * INTERNAL:
-     * Casts the passed object to SQLXML and calls getString and free methods
-     */
-    public static String getStringAndFreeSQLXML(Object sqlXml) throws SQLException { 
-        return getPlatform().getStringAndFreeSQLXML(sqlXml);
-    }
-}
+    private static final ConcurrentHashMap patternCache = new ConcurrentHashMap();
+
+    /**
+     * PERF: The regular expression compiled Pattern objects are cached
+     * to avoid re-compilation on every usage.
+     */
+    private static final ConcurrentHashMap regexpPatternCache = new ConcurrentHashMap();
+
+    /**
+     * INTERNAL:
+     * An implementation of in memory queries with Like which uses the
+     * regular expression framework.
+     */
+    public static Boolean conformLike(Object left, Object right) {
+        if ((left == null) && (right == null)) {
+            return Boolean.TRUE;
+        } else if ((left == null) || (right == null)) {
+            return Boolean.FALSE;
+        }
+        left = String.valueOf(left);
+        right = String.valueOf(right);
+        // PERF: First check the pattern cache for the pattern.
+        // Note that the original string is the key, to avoid having to translate it first.
+        Pattern pattern = (Pattern)patternCache.get(right);
+        if (pattern == null) {
+            // Bug 3936427 - Replace regular expression reserved characters with escaped version of those characters
+            // For instance replace ? with \?
+            String convertedRight = Helper.convertLikeToRegex((String)right);
+
+            pattern = Pattern.compile(convertedRight);
+            // Ensure cache does not grow beyond 100.
+            if (patternCache.size() > 100) {
+                patternCache.remove(patternCache.keySet().iterator().next());
+            }
+            patternCache.put(right, pattern);
+        }
+        return pattern.matcher((String)left).matches();
+    }
+
+    /**
+     * INTERNAL:
+     * An implementation of in memory queries with Regexp which uses the
+     * regular expression framework.
+     */
+    public static Boolean conformRegexp(Object left, Object right) {
+        if ((left == null) && (right == null)) {
+            return Boolean.TRUE;
+        } else if ((left == null) || (right == null)) {
+            return Boolean.FALSE;
+        }
+        left = String.valueOf(left);
+        right = String.valueOf(right);
+        // PERF: First check the pattern cache for the pattern.
+        // Note that the original string is the key, to avoid having to translate it first.
+        Pattern pattern = (Pattern)regexpPatternCache.get(right);
+        if (pattern == null) {
+            pattern = Pattern.compile((String)right);
+            // Ensure cache does not grow beyond 100.
+            if (regexpPatternCache.size() > 100) {
+                regexpPatternCache.remove(regexpPatternCache.keySet().iterator().next());
+            }
+            regexpPatternCache.put(right, pattern);
+        }
+        return pattern.matcher((String)left).matches();
+    }
+
+    /**
+     * INTERNAL:
+     * Indicates whether the passed object implements java.sql.SQLXML introduced in jdk 1.6
+     */
+    public static boolean isSQLXML(Object object) {
+        return (object instanceof SQLXML);
+    }
+
+    /**
+     * INTERNAL:
+     * Casts the passed object to SQLXML and calls getString and free methods
+     */
+    public static String getStringAndFreeSQLXML(Object sqlXml) throws SQLException {
+        String str = ((SQLXML)sqlXml).getString();
+        ((SQLXML)sqlXml).free();
+        return str;
+    }
+
+}


=====================================
org/eclipse/persistence/internal/helper/JavaSEPlatform.java
=====================================
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
  * which accompanies this distribution.
@@ -37,10 +37,67 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
     v1_7(1,7),
     /** Java SE 1.8. */
     v1_8(1,8),
-    /** Java SE 9. */
-    v1_9(1,9),
-    /** Java SE 9. */
-    v9_0(9, 0);
+    /** Java SE 9. Version alias 1.9 is added too.*/
+    v9_0(9,0, new Version(1,9)),
+    /** Java SE 10. */
+    v10_0(10,0),
+    /** Java SE 18.3. */
+    v18_3(18,3),
+    /** Java SE 18.9. */
+    v18_9(18,9);
+
+    public static final class Version {
+        /**
+         * Creates an instance of Java SE version numbers.
+         * @param major major version number
+         * @param minor minor version number
+         */
+        private Version(final int major, final int minor) {
+            this.major = major;
+            this.minor = minor;
+        }
+
+        /** Major version number. */
+        private final int major;
+
+        /** Minor version number. */
+        private final int minor;
+
+        /**
+         * Get major version number.
+         * @return Major version number.
+         */
+        public final int getMajor() {
+            return major;
+        }
+
+        /**
+         * Get minor version number.
+         * @return Minor version number.
+         */
+        public final int getMinor() {
+            return minor;
+        }
+
+        /**
+         * Return computer readable {@code String} containing version numbers in {@code <major> '.' <minor>} format.
+         * @return computer readable {@code String} containing version numbers
+         */
+        public String versionString() {
+            return JavaSEPlatform.versionString(major, minor);
+        }
+
+        // Currently this is identical with versionString() method.
+        /**
+         * Return version as human readable {@code String}.
+         * @return version as human readable {@code String}.
+         */
+        @Override
+        public String toString() {
+            return JavaSEPlatform.versionString(major, minor);
+        }
+
+    }
 
     /**
      * Stored <code>String</code> values for backward <code>String</code>
@@ -52,7 +109,15 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
     // Initialize backward String conversion Map.
     static {
         for (JavaSEPlatform platform : JavaSEPlatform.values()) {
+            // Primary version numbers mapping.
             stringValuesMap.put(platform.versionString(), platform);
+            // Additional version numbers mapping.
+            Version[] additional = platform.getAdditionalVersions();
+            if (additional != null) {
+                for (Version version : additional) {
+                    stringValuesMap.put(version.versionString(), platform);
+                }
+            }
         }
     }
 
@@ -66,6 +131,9 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
     /** Lowest supported Java SE platform. Currently it's Java SE 1.7. */
     public static final JavaSEPlatform MIN_SUPPORTED = v1_7;
 
+    /** Latest Java SE platform. This value is used when Java SE platform detection fails. */
+    static final JavaSEPlatform LATEST = JavaSEPlatform.v18_9;
+
     /**
      * Check whether current Java SE is exactly matching provided platform.
      * @param platform Java SE platform to compare with.
@@ -74,6 +142,14 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
         return CURRENT.equals(platform);
     }
 
+    /**
+     * Check whether current Java SE is at least (greater or equal) provided platform.
+     * @param platform Java SE platform to compare with.
+     */
+    public static boolean atLeast(JavaSEPlatform platform) {
+        return CURRENT.gte(platform);
+    }
+
     /**
      * Returns a <code>JavaSEPlatform</code> with a value represented by the
      * specified <code>String</code>. The <code>JavaSEPlatform</code> returned
@@ -96,14 +172,16 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
     }
 
     // There are not too many versions yet so direct mapping in code is simple.
+    // Version 1.9 is considered as valid version for 9.0.
     /**
      * Returns a <code>JavaSEPlatform</code> matching provided
      * <code>major</code> and <code>minor</code> version numbers.
      * @param major Major version number.
      * @param minor Minor version number.
      * @return <code>JavaSEPlatform</code> value matching provided
-     *         <code>major</code> and <code>minor</code> version numbers
-     *         or <code>null</code> when such a value does not exist.
+     *         <code>major</code> and <code>minor</code> version numbers.
+     *         {@code JavaSEPlatform.DEFAULT} value is returned for unknown
+     *         Java SE version numbers.
      */
     public static JavaSEPlatform toValue(final int major, final int minor) {
         switch (major) {
@@ -117,12 +195,20 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
                 case 6: return v1_6;
                 case 7: return v1_7;
                 case 8: return v1_8;
-                case 9: return v1_9;
-                default: return null;
+                case 9: return v9_0;
+                default: return LATEST;
             }
         case 9:
             return v9_0;
-        default: return null;
+        case 10:
+            return v10_0;
+        case 18:
+            switch (minor) {
+                case 3: return v18_3;
+                case 9: return v18_9;
+                default: return LATEST;
+            }
+        default: return LATEST;
         }
     }
 
@@ -143,26 +229,27 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
 
     /**
      * Constructs an instance of Java SE platform.
-     * @param major Major version number.
-     * @param minor Minor version number.
+     * @param major major version number
+     * @param minor minor version number
+     * @param addVersions additional version  numbers if defined
      */
-    JavaSEPlatform(final int major, final int minor) {
-        this.major = major;
-        this.minor = minor;
+    JavaSEPlatform(final int major, final int minor, Version ...addVersions) {
+        this.version = new Version(major, minor);
+        this.addVersions = addVersions;
     }
 
-    /** Major version number. */
-    private final int major;
+    /** Java SE version numbers. */
+    private final Version version;
 
-    /** Minor version number. */
-    private final int minor;
+    /** Additional version numbers. */
+    private final Version[] addVersions;
 
     /**
      * Get major version number.
      * @return Major version number.
      */
     public final int getMajor() {
-        return major;
+        return version.major;
     }
 
     /**
@@ -170,7 +257,16 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
      * @return Minor version number.
      */
     public final int getMinor() {
-        return minor;
+        return version.minor;
+    }
+
+    /**
+     * Get additional version numbers.
+     * @return an array of additional version numbers if exist or {@code null} if no additional
+     *         version numbers are defined.
+     */
+    public final Version[] getAdditionalVersions() {
+        return addVersions;
     }
 
     /**
@@ -179,7 +275,7 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
      * @return Value of <code>true</code> if this platform is equal
      *         or greater to specified platform or <code>false</code> otherwise.
      */
-    public boolean atLeast(final JavaSEPlatform platform) {
+    public boolean gte(final JavaSEPlatform platform) {
         return compareTo(platform) >= 0;
     }
 
@@ -193,23 +289,21 @@ public enum JavaSEPlatform implements Comparable<JavaSEPlatform> {
     }
 
     /**
-     * Generate {@link String} containing minor and major version numbers
-     * in {@code <major> '.' <minor>} format.
-     * @return Generated {@link String}
+     * Return computer readable {@code String} containing version numbers in {@code <major> '.' <minor>} format.
+     * @return computer readable {@code String} containing version numbers
      */
     public String versionString() {
-        return versionString(major, minor);
+        return versionString(version.major, version.minor);
     }
 
     // Currently this is identical with versionString() method.
     /**
-     * Convert Java SE platform version value to human readable
-     * <code>String</code>.
-     * @return A <code>String</code> representation of the value of this object.
+     * Return Java SE platform version as human readable {@code String}.
+     * @return Java SE platform version as human readable {@code String}.
      */
     @Override
     public String toString() {
-        return versionString(major, minor);
+        return versionString(version.major, version.minor);
     }
 
 }


=====================================
org/eclipse/persistence/internal/helper/JavaVersion.java
=====================================
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2016 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
  * which accompanies this distribution.
@@ -12,12 +12,11 @@
  ******************************************************************************/
 package org.eclipse.persistence.internal.helper;
 
-import java.security.AccessController;
+import java.lang.reflect.Method;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetSystemProperty;
 
 /**
  * Java version storage class. Used for version numbers retrieved from
@@ -34,16 +33,15 @@ public final class JavaVersion {
     public static final char PATCH_SEPARATOR = '_';
 
     /** Java VM version system property name. */
-    private static final String VM_VERSION_PROPERTY = "java.specification.version";
+    public static final String VM_VERSION_PROPERTY = "java.specification.version";
 
     /**
-     * Java specification version output regular expression pattern.
-     * Regular expression contains tokens to read individual version number
-     * components. Expected input is string like
-     * <code>java version "1.6"</code> or <code>9</code>.
+     * Compiled regular expression pattern to read individual version number components.
+     * Expected input is string like <code>java version "1.6"</code> or <code>9</code>.
      */
-    private static final String VM_VERSION_PATTERN =
-            "[^0-9]*([0-9]+)(\\.([0-9]+))*";
+    private static final Pattern VM_VERSION_PATTERN = Pattern.compile(
+            "[^0-9]*([0-9]+)(\\.([0-9]+))*"
+    );
 
     /** Number of <code>Matcher</code> groups (REGEX tokens) expected in Java VM
      *  version output. */
@@ -54,16 +52,75 @@ public final class JavaVersion {
      * @return Java specification version {@see String} from JDK system property.
      */
     public static String vmVersionString() {
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedGetSystemProperty(VM_VERSION_PROPERTY));
+        return PrivilegedAccessHelper.getSystemProperty(VM_VERSION_PROPERTY);
+    }
+
+    // EclipseLink still supports JDK <9 so using Runtime.Version to retrieve
+    // current JDK version is optional and can only be done trough reflection calls.
+    // TODO: Remove reflection after JDK <9 support is dropped.
+
+    /** JDK 9+ java.lang.Runtime.Version class name. */
+    private static final String VERSION_CLASS_NAME = "java.lang.Runtime$Version";
+
+    /** JDK 9+ java.lang.Runtime static version() method name. */
+    private static final String RUNTIME_VERSION_METHOD_NAME = "version";
+
+    /**
+     * Invoke {@code Runtime#version()} method to retrieve {@code Runtime.Version} instance.
+     * @return {@code Runtime.Version} instance for JDK 9 and later or {@code null} otherwise.
+     */
+    private static Object runtimeVersionObject() {
+        try {
+            final Method m = Runtime.class.getMethod(RUNTIME_VERSION_METHOD_NAME);
+            return m.invoke(null);
+        // Do not log, because AbstractSessionLog.getLog() causes cyclic dependency on ClassConstants during class initialization.
+        // NoSuchMethodException: JDK <9, can't use java.lang.Runtime.Version.
+        } catch (NoSuchMethodException e) {
+            return null;
+        // Other ReflectiveOperationException should not happen here. Otherwise throw it as RuntimeException.
+        } catch (ReflectiveOperationException e) {
+            throw new IllegalStateException(e);
         }
-        return System.getProperty(VM_VERSION_PROPERTY);
     }
 
     /**
-     * Java specification version detector.
-     * Retrieves Java specification version from JDK system property. Version string should
-     * look like:<ul>
+     * Invoke {@code Runtime.Version} method with given name ({@code major} or {@code minor}) to retrieve version numbers.
+     * @param vClass {@code Runtime.Version} class.
+     * @param vObj {@code Runtime.Version} class instance containing JDK version information.
+     * @param name name of {@code Runtime.Version} instance method to invoke.
+     */
+    private static Integer getRuntimeVersionNumber(final Object vObj, final String name) {
+        try {
+            final Method m = vObj.getClass().getMethod(name);
+            return (Integer) m.invoke(vObj);
+        // Do not log, because AbstractSessionLog.getLog() causes cyclic dependency on ClassConstants during class initialization.
+        // ReflectiveOperationException should not happen here. Otherwise throw it as RuntimeException.
+        } catch (ReflectiveOperationException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    /**
+     * Retrieve JDK version numbers from {@code Runtime.Version} instance returned by {@code Runtime#version()} method.
+     * This works only for JDK 9 and later.
+     * @return Current JDK version for JDK 9 and later or {@code null} otherwise or when any problem with version retrieval happened.
+     */
+    private static JavaVersion runtimeVersion() {
+        final Object vObj = runtimeVersionObject();
+        if (vObj == null) {
+            return null;
+        }
+        final Integer major = getRuntimeVersionNumber(vObj, "major");
+        final Integer minor = getRuntimeVersionNumber(vObj, "minor");
+        if (major != null && minor != null) {
+            return new JavaVersion(major, minor);
+        }
+        return null;
+    }
+
+    /**
+     * Parse Java specification version from JDK system property provided as an argument.
+     * Version string should look like:<ul>
      * <li/><code>"MA.MI"</code>
      * </ul>
      * Where<ul>
@@ -71,11 +128,10 @@ public final class JavaVersion {
      * <li/>MI is minor version number
      * </ul>
      * Label <code>java version</code> is parsed as non case sensitive.
+     * @return Current JDK version for any JDK from system property.
      */
-    public static JavaVersion vmVersion() {
-        final String version = vmVersionString();
-        final Pattern pattern = Pattern.compile(VM_VERSION_PATTERN);
-        final Matcher matcher = pattern.matcher(version);
+    private static JavaVersion propertyVersionParser(final String version) {
+        final Matcher matcher = VM_VERSION_PATTERN.matcher(version);
         int major = 0, minor = 0;
         if (matcher.find()) {
             major = Integer.parseInt(matcher.group(1));
@@ -85,6 +141,22 @@ public final class JavaVersion {
         return new JavaVersion(major, minor);
     }
 
+    /**
+     * Retrieve Java specification version from JDK system property.
+     * @return Current JDK version for any JDK from system property.
+     */
+    private static JavaVersion propertyVersion() {
+        return propertyVersionParser(vmVersionString());
+    }
+
+    /**
+     * Java specification version detector.
+     */
+    public static JavaVersion vmVersion() {
+        final JavaVersion version = runtimeVersion();
+        return version != null ? version : propertyVersion();
+    }
+
     /** Major version number. */
     private final int major;
 
@@ -152,7 +224,8 @@ public final class JavaVersion {
 
     /**
      * Return {@link JavaSEPlatform} matching this Java SE specification version.
-     * @return {@link JavaSEPlatform} matching this Java SE specification version.
+     * @return {@link JavaSEPlatform} matching this Java SE specification version
+     *         or {@code JavaSEPlatform.DEFAULT} as default when platform matching fails.
      */
     public final JavaSEPlatform toPlatform() {
         return JavaSEPlatform.toValue(major, minor);


=====================================
org/eclipse/persistence/internal/jpa/EntityManagerFactoryDelegate.java
=====================================
@@ -1,8 +1,8 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2016 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
  * and the Eclipse Distribution License is available at 
  * http://www.eclipse.org/org/documents/edl-v10.php.
@@ -747,11 +747,12 @@ public class EntityManagerFactoryDelegate implements EntityManagerFactory, Persi
     
     public void addNamedQuery(String name, Query query) {
         DatabaseQuery unwrapped = (DatabaseQuery) query.unwrap(DatabaseQuery.class).clone();
-        if (((QueryImpl)query).lockMode != null){
-            ((ObjectLevelReadQuery)unwrapped).setLockModeType(((QueryImpl)query).lockMode.name(), session);
+        QueryImpl originalQuery = query.unwrap(QueryImpl.class);
+        if (originalQuery.lockMode != null){
+            ((ObjectLevelReadQuery)unwrapped).setLockModeType(originalQuery.lockMode.name(), session);
         }
         if (unwrapped.isReadQuery()){
-            ((ReadQuery)unwrapped).setInternalMax((((QueryImpl)query).getMaxResultsInternal()));
+            ((ReadQuery)unwrapped).setInternalMax((originalQuery.getMaxResultsInternal()));
             if (query.getFirstResult() != QueryImpl.UNDEFINED){
                 ((ReadQuery)unwrapped).setFirstResult(query.getFirstResult());
             }


=====================================
org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java
=====================================
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 1998, 2016 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
+ * Copyright (c) 1998, 2018 Oracle and/or its affiliates, IBM Corporation. All rights reserved.
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
  * which accompanies this distribution.
@@ -205,6 +205,7 @@ import org.eclipse.persistence.internal.jpa.metamodel.proxy.SingularAttributePro
 import org.eclipse.persistence.internal.jpa.weaving.PersistenceWeaver;
 import org.eclipse.persistence.internal.jpa.weaving.TransformerFactory;
 import org.eclipse.persistence.internal.localization.ExceptionLocalization;
+import org.eclipse.persistence.internal.localization.LoggingLocalization;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
 import org.eclipse.persistence.internal.security.PrivilegedGetDeclaredField;
@@ -1655,14 +1656,17 @@ public class EntityManagerSetupImpl implements MetadataRefreshListener {
      */
     public synchronized ClassTransformer predeploy(PersistenceUnitInfo info, Map extendedProperties) {
         ClassLoader classLoaderToUse = null;
+        // session == null
         if (state == STATE_DEPLOY_FAILED || state == STATE_UNDEPLOYED) {
             throw new PersistenceException(EntityManagerSetupException.cannotPredeploy(persistenceUnitInfo.getPersistenceUnitName(), state, persistenceException));
         }
+        // session != null
         if (state == STATE_PREDEPLOYED || state == STATE_DEPLOYED || state == STATE_HALF_DEPLOYED) {
             session.log(SessionLog.FINEST, SessionLog.JPA, "predeploy_begin", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), session.getName(), state, factoryCount});
             factoryCount++;
             session.log(SessionLog.FINEST, SessionLog.JPA, "predeploy_end", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), session.getName(), state, factoryCount});
             return null;
+        // session == null
         } else if (state == STATE_INITIAL) {
             persistenceUnitInfo = info;
             if (!isCompositeMember()) {
@@ -1675,11 +1679,9 @@ public class EntityManagerSetupImpl implements MetadataRefreshListener {
                     }
                 }
             }
-        } else if (state == STATE_HALF_PREDEPLOYED_COMPOSITE_MEMBER) {
-            session.log(SessionLog.FINEST, SessionLog.JPA, "predeploy_begin", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), session.getName(), state + " " + mode, factoryCount});
         }
         
-        // state is INITIAL or PREDEPLOY_FAILED or STATE_HALF_PREDEPLOYED_COMPOSITE_MEMBER
+        // state is INITIAL or PREDEPLOY_FAILED or STATE_HALF_PREDEPLOYED_COMPOSITE_MEMBER, session == null
         try {
             // properties not used in STATE_HALF_PREDEPLOYED_COMPOSITE_MEMBER
             Map predeployProperties = null;
@@ -2027,7 +2029,22 @@ public class EntityManagerSetupImpl implements MetadataRefreshListener {
             state = STATE_PREDEPLOY_FAILED;
             // cache this.persistenceException before slow logging
             PersistenceException persistenceEx = createPredeployFailedPersistenceException(ex);
-            session.log(SessionLog.FINEST, SessionLog.JPA, "predeploy_end", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), session.getName(), state, factoryCount});
+            // If session exists, use it for logging
+            if (session != null) {
+                session.log(SessionLog.FINEST, SessionLog.JPA, "predeploy_end", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), session.getName(), state, factoryCount});
+            // If at least staticWeaveInfo exists, use it for logging
+            } else if (staticWeaveInfo != null && staticWeaveInfo.getLogLevel() <= SessionLog.FINEST) {
+                Writer logWriter = staticWeaveInfo.getLogWriter();
+                if (logWriter != null) {
+                    String message = LoggingLocalization.buildMessage("predeploy_end", new Object[]{getPersistenceUnitInfo().getPersistenceUnitName(), "N/A", state, factoryCount});
+                    try {
+                        logWriter.write(message);
+                        logWriter.write(Helper.cr());
+                    } catch (IOException ioex) {
+                        // Ignore IOException
+                    }
+                }
+            }
             session = null;
             mode = null;
             throw persistenceEx;


=====================================
org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
=====================================
@@ -1,8 +1,8 @@
-/*******************************************************************************
- * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
- * which accompanies this distribution. 
+/*******************************************************************************
+ * Copyright (c) 1998, 2017 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
  * and the Eclipse Distribution License is available at 
  * http://www.eclipse.org/org/documents/edl-v10.php.
@@ -11,33 +11,33 @@
  *     05/16/2008-1.0M8 Guy Pelletier 
  *       - 218084: Implement metadata merging functionality between mapping files
  *     01/05/2010-2.1 Guy Pelletier 
- *       - 211324: Add additional event(s) support to the EclipseLink-ORM.XML Schema
- *     07/15/2010-2.2 Guy Pelletier 
- *       -311395 : Multiple lifecycle callback methods for the same lifecycle event
- ******************************************************************************/  
-package org.eclipse.persistence.internal.jpa.metadata.listeners;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.persistence.descriptors.DescriptorEvent;
-import org.eclipse.persistence.descriptors.DescriptorEventAdapter;
-import org.eclipse.persistence.descriptors.DescriptorEventManager;
-
-import org.eclipse.persistence.exceptions.ValidationException;
-
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
-import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
+ *       - 211324: Add additional event(s) support to the EclipseLink-ORM.XML Schema
+ *     07/15/2010-2.2 Guy Pelletier
+ *       -311395 : Multiple lifecycle callback methods for the same lifecycle event
+ *     12/14/2017-2.6.6 Tomas Kraus
+ *       - 291546: Performance degradation due to usage of Vector in DescriptorEventManager
+ ******************************************************************************/
+package org.eclipse.persistence.internal.jpa.metadata.listeners;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.persistence.descriptors.DescriptorEvent;
+import org.eclipse.persistence.descriptors.DescriptorEventAdapter;
+import org.eclipse.persistence.descriptors.DescriptorEventManager;
+import org.eclipse.persistence.exceptions.ValidationException;
+import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.eclipse.persistence.internal.security.PrivilegedMethodInvoker;
+import org.eclipse.persistence.internal.security.PrivilegedNewInstanceFromClass;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.logging.SessionLog;
 
@@ -60,41 +60,42 @@ public class EntityListener extends DescriptorEventAdapter {
     public final static String PRE_REMOVE = "preRemove";
     public final static String PRE_UPDATE_WITH_CHANGES = "preUpdateWithChanges";
     
-    private Object m_listener;
-    private Class m_listenerClass;
-    private Class m_entityClass;
-    private Hashtable<String, List<Method>> m_methods;
-    private Hashtable<String, Hashtable<Integer, Boolean>> m_overriddenEvents;
-    private static Hashtable<Integer, String> m_eventStrings;
-    private AbstractSession owningSession;
-
-    /**
-     * INTERNAL: 
-     */
-    protected EntityListener(Class entityClass) {
-        m_entityClass = entityClass;
-        m_methods = new Hashtable<String, List<Method>>();
-        
-        // Remember which events are overridden in subclasses. Overriden events
-        // must be built for each subclass chain.
-        m_overriddenEvents = new Hashtable<String, Hashtable<Integer, Boolean>>();
-        
-        // For quick look up of equivalent event strings from event codes.
-        if (m_eventStrings == null) {
-            m_eventStrings = new Hashtable<Integer, String>();   
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostBuildEvent), POST_BUILD);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostCloneEvent), POST_CLONE);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostDeleteEvent), POST_DELETE);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostInsertEvent), POST_INSERT);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostRefreshEvent), POST_REFRESH);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PostUpdateEvent), POST_UPDATE);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PrePersistEvent), PRE_PERSIST);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PreRemoveEvent), PRE_REMOVE);
-            m_eventStrings.put(Integer.valueOf(DescriptorEventManager.PreUpdateWithChangesEvent), PRE_UPDATE_WITH_CHANGES);
-        }
-    }
-    
-    public EntityListener(Class listenerClass, Class entityClass){
+    private Object m_listener;
+    private Class m_listenerClass;
+    private Class m_entityClass;
+    private Map<String, List<Method>> m_methods;
+    private final Map<String, Map<Integer, Boolean>> m_overriddenEvents;
+    private static final Map<Integer, String> m_eventStrings;
+    private AbstractSession owningSession;
+
+    static {
+        // For quick look up of equivalent event strings from event codes.
+        Map<Integer, String> mappings = new HashMap<>(9);
+        mappings.put(DescriptorEventManager.PostBuildEvent, POST_BUILD);
+        mappings.put(DescriptorEventManager.PostCloneEvent, POST_CLONE);
+        mappings.put(DescriptorEventManager.PostDeleteEvent, POST_DELETE);
+        mappings.put(DescriptorEventManager.PostInsertEvent, POST_INSERT);
+        mappings.put(DescriptorEventManager.PostRefreshEvent, POST_REFRESH);
+        mappings.put(DescriptorEventManager.PostUpdateEvent, POST_UPDATE);
+        mappings.put(DescriptorEventManager.PrePersistEvent, PRE_PERSIST);
+        mappings.put(DescriptorEventManager.PreRemoveEvent, PRE_REMOVE);
+        mappings.put(DescriptorEventManager.PreUpdateWithChangesEvent, PRE_UPDATE_WITH_CHANGES);
+        m_eventStrings = Collections.unmodifiableMap(mappings);
+    }
+
+    /**
+     * INTERNAL:
+     */
+    protected EntityListener(Class entityClass) {
+        m_entityClass = entityClass;
+        m_methods = new ConcurrentHashMap<>();
+
+        // Remember which events are overridden in subclasses. Overriden events
+        // must be built for each subclass chain.
+        m_overriddenEvents = new ConcurrentHashMap<>();
+    }
+
+    public EntityListener(Class listenerClass, Class entityClass){
         this(entityClass);
         this.m_listenerClass = listenerClass;
     }
@@ -178,20 +179,20 @@ public class EntityListener extends DescriptorEventAdapter {
         return m_entityClass;
     }
     
-    /**
-     * INTERNAL:
-     */
-    public Hashtable<String, List<Method>> getAllEventMethods() {
-        return m_methods;
-    }
-    
-    /**
-     * INTERNAL:
-     */
-    public void setAllEventMethods(Hashtable<String, List<Method>> methods) {
-        m_methods = methods;
-    }
-    
+    /**
+     * INTERNAL:
+     */
+    public Map<String, List<Method>> getAllEventMethods() {
+        return m_methods;
+    }
+
+    /**
+     * INTERNAL:
+     */
+    public void setAllEventMethods(Map<String, List<Method>> methods) {
+        m_methods = methods;
+    }
+
     /**
      * INTERNAL:
      */
@@ -201,18 +202,13 @@ public class EntityListener extends DescriptorEventAdapter {
     
     /**
      * INTERNAL:
-     */
-    protected List<Method> getEventMethods(int eventCode) {
-        String eventString = m_eventStrings.get(eventCode);
-        
-        if (eventString != null) {
-            return getEventMethods(eventString);
-        } else {
-            return null;
-        }
-    }
-    
-    /**
+     */
+    protected List<Method> getEventMethods(int eventCode) {
+        String eventString = m_eventStrings.get(eventCode);
+        return eventString != null ? getEventMethods(eventString) : null;
+    }
+
+    /**
      * INTERNAL:
      */
     protected List<Method> getEventMethods(String event) {
@@ -354,29 +350,29 @@ public class EntityListener extends DescriptorEventAdapter {
 
     /**
      * INTERNAL:
-     * Return true if listener has a lifecycle callback method that is 
-     * overridden in a subclass.
-     */
-    public boolean isOverriddenEvent(DescriptorEvent event, Vector eventManagers) {
-        int eventCode = event.getEventCode();
-        String forSubclass = event.getDescriptor().getJavaClassName();
-        Hashtable<Integer, Boolean> subClassMap = m_overriddenEvents.get(forSubclass);
-        
-        // If we haven't built an overridden events map for this subclass, do so now.
-        if (subClassMap == null) {
-            subClassMap = new Hashtable<Integer, Boolean>();
-        }
-        
-        // Now check the individual events for this subclass.
+     * Return true if listener has a lifecycle callback method that is
+     * overridden in a subclass.
+     */
+    public boolean isOverriddenEvent(DescriptorEvent event, List<DescriptorEventManager> eventManagers) {
+        int eventCode = event.getEventCode();
+        String forSubclass = event.getDescriptor().getJavaClassName();
+        Map<Integer, Boolean> subClassMap = m_overriddenEvents.get(forSubclass);
+
+        // If we haven't built an overridden events map for this subclass, do so now.
+        if (subClassMap == null) {
+            subClassMap = new ConcurrentHashMap<>();
+        }
+
+        // Now check the individual events for this subclass.
         if (! subClassMap.containsKey(eventCode)) {
             boolean hasOverrides = false;
-            if (hasEventMethods(eventCode)) {
-                List<Method> eventMethods = getEventMethods(eventCode);
-                for (Method eventMethod : eventMethods) {
-                    for (DescriptorEventManager eventManager : (Vector<DescriptorEventManager>) eventManagers) {
-                        EntityListener childListener = (EntityListener) eventManager.getEntityEventListener();
-                    
-                        // We can't override ourself ...
+            if (hasEventMethods(eventCode)) {
+                List<Method> eventMethods = getEventMethods(eventCode);
+                for (Method eventMethod : eventMethods) {
+                    for (DescriptorEventManager eventManager : eventManagers) {
+                        EntityListener childListener = (EntityListener) eventManager.getEntityEventListener();
+
+                        // We can't override ourself ...
                         if (childListener == this) {
                             break;
                         } else {


=====================================
org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
=====================================
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017 Oracle and/or its affiliates. All rights reserved.
  * This program and the accompanying materials are made available under the 
  * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
  * which accompanies this distribution. 
@@ -11,6 +11,8 @@
  *     Oracle - initial API and implementation
  *     08/01/2012-2.5 Chris Delahunt
  *       - 371950: Metadata caching 
+ *     12/14/2017-2.6.6 Tomas Kraus
+ *       - 291546: Performance degradation due to usage of Vector in DescriptorEventManager
  ******************************************************************************/ 
 package org.eclipse.persistence.internal.jpa.metadata.listeners;
 
@@ -18,8 +20,9 @@ import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.util.ArrayList;
-import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.descriptors.DescriptorEventListener;
@@ -37,7 +40,7 @@ public class JPAEntityListenerHolder implements SerializableDescriptorEventHolde
 
     public transient DescriptorEventListener listener;
 
-    public java.util.Hashtable<String,java.util.List<MethodSerialImpl>> serializableMethods;
+    public Map<String,java.util.List<MethodSerialImpl>> serializableMethods;
 
     public void setIsDefaultListener(Boolean isDefaultListener) {
         this.isDefaultListener = isDefaultListener;
@@ -103,8 +106,8 @@ public class JPAEntityListenerHolder implements SerializableDescriptorEventHolde
         return entityListenerClassInstance;
     }
     
-    public void convertToSerializableMethods(java.util.Hashtable<String,java.util.List<Method>> methods) {
-        this.serializableMethods = new java.util.Hashtable();
+    public void convertToSerializableMethods(Map<String, List<Method>> methods) {
+        this.serializableMethods = new ConcurrentHashMap<>();
         for (String event: methods.keySet()){
             java.util.List<Method> methodList = methods.get(event);
             java.util.List<MethodSerialImpl> newMethodList = new java.util.ArrayList();
@@ -163,8 +166,8 @@ public class JPAEntityListenerHolder implements SerializableDescriptorEventHolde
      * @param loader
      * @return
      */
-    public java.util.Hashtable<String,java.util.List<Method>> convertToMethods(ClassLoader loader) {
-        java.util.Hashtable<String,java.util.List<Method>> table = new java.util.Hashtable();
+    public Map<String,java.util.List<Method>> convertToMethods(ClassLoader loader) {
+        Map<String,java.util.List<Method>> table = new ConcurrentHashMap<>();
         for (String event: serializableMethods.keySet()){
             java.util.List<MethodSerialImpl> methodList = serializableMethods.get(event);
             java.util.List<Method> newMethodList = new java.util.ArrayList();
@@ -181,9 +184,9 @@ public class JPAEntityListenerHolder implements SerializableDescriptorEventHolde
         return table;
     }
     
-    public java.util.Hashtable<String,java.util.List<MethodSerialImpl>> getMethods() {
+    public Map<String,java.util.List<MethodSerialImpl>> getMethods() {
         if (serializableMethods == null) {
-            serializableMethods = new Hashtable<String, List<MethodSerialImpl>>();
+            serializableMethods = new ConcurrentHashMap<String, List<MethodSerialImpl>>();
         }
         return serializableMethods;
     }


=====================================
org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java
=====================================
@@ -28,8 +28,6 @@ import org.eclipse.persistence.internal.libraries.asm.Label;
 import org.eclipse.persistence.internal.libraries.asm.MethodVisitor;
 import org.eclipse.persistence.internal.libraries.asm.Opcodes;
 import org.eclipse.persistence.internal.libraries.asm.Type;
-import org.eclipse.persistence.internal.weaving.WeaverLogger;
-import org.eclipse.persistence.logging.SessionLog;
 
 /**
  * INTERNAL: Weaves classes to allow them to support EclipseLink indirection.
@@ -920,12 +918,7 @@ public class ClassWeaver extends ClassVisitor implements Opcodes {
      * "city") { this.city = (String)city; } }
      */
     public void addPersistenceGetSet(ClassDetails classDetails) {
-        // PERF: Is finest logging turned on?
-        final boolean shouldLogFinest = WeaverLogger.shouldLog(SessionLog.FINEST);
         // create the _persistence_get() method
-        if (shouldLogFinest) {
-            WeaverLogger.log(SessionLog.FINEST, "class_weaver_add_get_set_add_get", classDetails.getClassName());
-        }
         MethodVisitor cv_get = cv.visitMethod(ACC_PUBLIC, "_persistence_get", "(Ljava/lang/String;)Ljava/lang/Object;", null, null);
 
         Label label = null;
@@ -970,9 +963,6 @@ public class ClassWeaver extends ClassVisitor implements Opcodes {
         cv_get.visitMaxs(0, 0);
 
         // create the _persistence_set() method
-        if (shouldLogFinest) {
-            WeaverLogger.log(SessionLog.FINEST, "class_weaver_add_get_set_add_set", classDetails.getClassName());
-        }
         MethodVisitor cv_set = cv.visitMethod(ACC_PUBLIC, "_persistence_set", "(Ljava/lang/String;Ljava/lang/Object;)V", null, null);
 
         label = null;
@@ -1373,12 +1363,7 @@ public class ClassWeaver extends ClassVisitor implements Opcodes {
      * to the end.
      */
     public void visitEnd() {
-        // PERF: Is finest logging turned on?
-        final boolean shouldLogFinest = WeaverLogger.shouldLog(SessionLog.FINEST);
         if (!alreadyWeaved) {
-            if (shouldLogFinest) {
-                WeaverLogger.log(SessionLog.FINEST, "class_weaver_visit_end_do", classDetails.getClassName());
-            }
             if (this.classDetails.shouldWeaveInternal()) {
 
                 // Add a persistence and shallow clone method.
@@ -1457,8 +1442,6 @@ public class ClassWeaver extends ClassVisitor implements Opcodes {
                     addFetchGroupMethods(this.classDetails);
                 }
             }
-        } else if (shouldLogFinest) {
-            WeaverLogger.log(SessionLog.FINEST, "class_weaver_visit_end_skip", classDetails.getClassName());
         }
         if (classDetails.shouldWeaveREST() && classDetails.getSuperClassDetails() == null) {
             weavedRest = true;


=====================================
org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java
=====================================
@@ -31,7 +31,7 @@ import org.eclipse.persistence.internal.libraries.asm.ClassWriter;
 import org.eclipse.persistence.internal.libraries.asm.commons.SerialVersionUIDAdder;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedGetClassLoaderFromCurrentThread;
-import org.eclipse.persistence.internal.weaving.WeaverLogger;
+import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.sessions.Session;
 
@@ -94,8 +94,8 @@ public class PersistenceWeaver implements ClassTransformer {
     public byte[] transform(final ClassLoader loader, final String className,
             final Class classBeingRedefined, final ProtectionDomain protectionDomain,
             final byte[] classfileBuffer) throws IllegalClassFormatException {
-        // PERF: Is finest logging turned on?
-        final boolean shouldLogFinest = WeaverLogger.shouldLog(SessionLog.FINEST);
+        // PERF: Is finest logging on weaving turned on?
+        final boolean shouldLogFinest = ((AbstractSession)session).shouldLog(SessionLog.FINEST, SessionLog.WEAVER);
         final Map classDetailsMap = this.classDetailsMap;
         final Session session = this.session;
         // Check if cleared already.
@@ -113,45 +113,14 @@ public class PersistenceWeaver implements ClassTransformer {
 
             if (classDetails != null) {
                 if (shouldLogFinest) {
-                    WeaverLogger.log(SessionLog.FINEST, "begin_weaving_class", className);
+                    ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "begin_weaving_class", className);
                 }
                 final ClassReader classReader = new ClassReader(classfileBuffer);
                 ClassWriter classWriter = null;
                 final String introspectForHierarchy = System.getProperty(SystemProperties.WEAVING_REFLECTIVE_INTROSPECTION, null);
                 if (introspectForHierarchy != null) {
-                    if (shouldLogFinest) {
-                        ClassLoader contextClassLoader;
-                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                            try {
-                                contextClassLoader = AccessController.doPrivileged(
-                                        new PrivilegedGetClassLoaderFromCurrentThread());
-                            } catch (PrivilegedActionException ex) {
-                                throw (RuntimeException) ex.getCause();
-                            }
-                        } else {
-                            contextClassLoader = Thread.currentThread().getContextClassLoader();
-                        }
-                        WeaverLogger.log(SessionLog.FINEST, "weaving_init_class_writer", className,
-                                Integer.toHexString(System.identityHashCode(contextClassLoader)));
-                    }
                     classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
                 } else {
-                    if (shouldLogFinest) {
-                        ClassLoader contextClassLoader;
-                        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                            try {
-                                contextClassLoader = AccessController.doPrivileged(
-                                        new PrivilegedGetClassLoaderFromCurrentThread());
-                            } catch (PrivilegedActionException ex) {
-                                throw (RuntimeException) ex.getCause();
-                            }
-                        } else {
-                            contextClassLoader = Thread.currentThread().getContextClassLoader();
-                        }
-                        WeaverLogger.log(SessionLog.FINEST, "weaving_init_compute_class_writer", className,
-                                Integer.toHexString(System.identityHashCode(contextClassLoader)),
-                                loader != null ? Integer.toHexString(System.identityHashCode(loader)) : "null");
-                      }
                     classWriter = new ComputeClassWriter(loader, ClassWriter.COMPUTE_FRAMES);
                 }
                 final ClassWeaver classWeaver = new ClassWeaver(classWriter, classDetails);
@@ -159,7 +128,7 @@ public class PersistenceWeaver implements ClassTransformer {
                 classReader.accept(sv, 0);
                 if (classWeaver.alreadyWeaved) {
                     if (shouldLogFinest) {
-                        WeaverLogger.log(SessionLog.FINEST, "end_weaving_class", className);
+                        ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "end_weaving_class", className);
                     }
                     return null;
                 }
@@ -173,42 +142,40 @@ public class PersistenceWeaver implements ClassTransformer {
                     // PERF: Don't execute this set of if statements with logging turned off.
                     if (shouldLogFinest) {
                         if (classWeaver.weavedPersistenceEntity) {
-                            WeaverLogger.log(SessionLog.FINEST, "weaved_persistenceentity", className);
+                            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "weaved_persistenceentity", className);
                         }
                         if (classWeaver.weavedChangeTracker) {
-                            WeaverLogger.log(SessionLog.FINEST, "weaved_changetracker", className);
+                            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "weaved_changetracker", className);
                         }
                         if (classWeaver.weavedLazy) {
-                            WeaverLogger.log(SessionLog.FINEST, "weaved_lazy", className);
+                            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "weaved_lazy", className);
                         }
                         if (classWeaver.weavedFetchGroups) {
-                            WeaverLogger.log(SessionLog.FINEST, "weaved_fetchgroups", className);
+                            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "weaved_fetchgroups", className);
                         }
                         if (classWeaver.weavedRest) {
-                            WeaverLogger.log(SessionLog.FINEST, "weaved_rest", className);
+                            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "weaved_rest", className);
                         }
-                        WeaverLogger.log(SessionLog.FINEST, "end_weaving_class", className);
+                        ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "end_weaving_class", className);
                     }
                     return bytes;
                 }
                 if (shouldLogFinest) {
-                    WeaverLogger.log(SessionLog.FINEST, "end_weaving_class", className);
+                    ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "end_weaving_class", className);
                 }
             } else {
                 if (shouldLogFinest) {
-                    WeaverLogger.log(SessionLog.FINEST, "transform_missing_class_details", className);
+                    ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "transform_missing_class_details", className);
                 }
             }
         } catch (Throwable exception) {
-            if (WeaverLogger.shouldLog(SessionLog.FINE)) {
-                WeaverLogger.log(SessionLog.FINE, "exception_while_weaving", new Object[] {className, exception.getLocalizedMessage()});
-                if (shouldLogFinest) {
-                    WeaverLogger.logThrowable(SessionLog.FINEST, exception);
-                }
+            ((AbstractSession)session).log(SessionLog.WARNING, SessionLog.WEAVER, "exception_while_weaving", new Object[] {className, exception.getLocalizedMessage()});
+            if (shouldLogFinest) {
+                ((AbstractSession)session).logThrowable(SessionLog.FINEST, SessionLog.WEAVER, exception);
             }
         }
         if (shouldLogFinest) {
-            WeaverLogger.log(SessionLog.FINEST, "transform_existing_class_bytes", className);
+            ((AbstractSession)session).log(SessionLog.FINEST, SessionLog.WEAVER, "transform_existing_class_bytes", className);
         }
         return null; // returning null means 'use existing class bytes'
     }


=====================================
org/eclipse/persistence/internal/localization/i18n/LoggingLocalizationResource.java
=====================================
@@ -484,6 +484,7 @@ public class LoggingLocalizationResource extends ListResourceBundle {
         { "dbws_orm_metadata_read_error", "Could not read ORM metadata: [{0}]"},
         { "dbws_oxm_metadata_read_error", "Could not read OXM metadata: [{0}]"},
         { "dbws_no_wsdl_inline_schema", "Could not read WSDL inline schema: [{0}]"},
+        { "javase_version_ex_method_call", "Exception when calling method {0}: {1}" },
 
         // FINEST, FINER and FINE level messages.
         { "acquire_unit_of_work_with_argument", "acquire unit of work: {0}" },
@@ -703,8 +704,6 @@ public class LoggingLocalizationResource extends ListResourceBundle {
         { "weaver_processing_class", "Class [{0}] registered to be processed by weaver."},
         { "begin_weaving_class", "Begin weaver class transformer processing class [{0}]."},
         { "end_weaving_class", "End weaver class transformer processing class [{0}]."},
-        { "weaving_init_class_writer", "Initializing class writer for [{0}]. Class loaders: context [{1}]."},
-        { "weaving_init_compute_class_writer", "Initializing compute class writer for [{0}]. Class loaders: context [{1}] argument [{2}]."},
         { "transform_missing_class_details", "Missing class details for [{0}]."},
         { "transform_existing_class_bytes", "Using existing class bytes for [{0}]."},
         { "weaved_lazy", "Weaved lazy (ValueHolder indirection) [{0}]."},
@@ -712,13 +711,6 @@ public class LoggingLocalizationResource extends ListResourceBundle {
         { "weaved_changetracker", "Weaved change tracking (ChangeTracker) [{0}]."},
         { "weaved_persistenceentity", "Weaved persistence (PersistenceEntity) [{0}]."},
         { "weaved_rest", "Weaved REST [{0}]."},
-        { "class_weaver_add_get_set_add_get", "Adding _persistence_get() method into [{0}]." },
-        { "class_weaver_add_get_set_add_set", "Adding _persistence_set() method into [{0}]." },
-        { "class_weaver_visit_end_do","Visiting the end of the class [{0}]." },
-        { "class_weaver_visit_end_skip","Skipping the end of the class [{0}]." },
-        { "class_weaver_visit_end_internal","Processing internal optimizations [{0}]." },
-        { "weaving_call_persistence_get", "Calling [{0}]._persistence_get. Class loaders: context [{1}], instance [{2}]"},
-        { "weaving_call_persistence_set", "Calling [{0}]._persistence_set. Class loaders: context [{1}], instance [{2}]"},
         { "cmp_init_invoke_predeploy", "JavaSECMPInitializer - predeploying {0}."},
         { "cmp_init_register_transformer", "JavaSECMPInitializer - registering transformer for {0}."},
         { "cmp_init_tempLoader_created", "JavaSECMPInitializer - created temporary ClassLoader: {0}."},
@@ -825,7 +817,8 @@ public class LoggingLocalizationResource extends ListResourceBundle {
         { "jaxp_sec_disabled", "Xml Security disabled, no JAXP {0} external access configuration necessary." },
         { "jaxp_sec_explicit", "Detected explicitly JAXP configuration, no JAXP {0} external access configuration necessary." },
         { "jaxp_sec_prop_supported", "Property {0} is supported and has been successfully set by used JAXP implementation." },
-        { "jaxp_sec_prop_not_supported", "Property {0} is not supported by used JAXP implementation." }
+        { "jaxp_sec_prop_not_supported", "Property {0} is not supported by used JAXP implementation." },
+        { "javase_version_ex_method_not_found", "Method {0} was not found in {1}" }
     };
 
     /**


=====================================
org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
=====================================
@@ -25,12 +25,20 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.persistence.config.PersistenceUnitProperties;
+import org.eclipse.persistence.config.SystemProperties;
 import org.eclipse.persistence.internal.helper.Helper;
+import org.eclipse.persistence.internal.helper.JavaVersion;
 import org.eclipse.persistence.internal.localization.ExceptionLocalization;
+import org.eclipse.persistence.platform.server.ServerPlatformBase;
+import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
 
 /**
  * INTERNAL:
@@ -50,6 +58,17 @@ public class PrivilegedAccessHelper {
     private static boolean shouldCheckPrivilegedAccess = true;
     private static boolean shouldUsePrivilegedAccess = false;
 
+    private final static String[] legalProperties = { "file.separator", "java.io.tmpdir", JavaVersion.VM_VERSION_PROPERTY, "line.separator", "path.separator", "user.dir",
+            "org.eclipse.persistence.fetchgroupmonitor", "org.eclipse.persistence.querymonitor", "SAP_J2EE_Engine_Version",
+            PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, PersistenceUnitProperties.JAVASE_DB_INTERACTION,
+            PersistenceUnitProperties.LOGGING_FILE, PersistenceUnitProperties.LOGGING_LEVEL,
+            SystemProperties.ARCHIVE_FACTORY, SystemProperties.DO_NOT_PROCESS_XTOMANY_FOR_QBE, SystemProperties.RECORD_STACK_ON_LOCK,
+            SystemProperties.WEAVING_OUTPUT_PATH, SystemProperties.WEAVING_SHOULD_OVERWRITE, SystemProperties.WEAVING_REFLECTIVE_INTROSPECTION,
+            SystemProperties.DO_NOT_PROCESS_XTOMANY_FOR_QBE,
+            ServerPlatformBase.JMX_REGISTER_RUN_MBEAN_PROPERTY, ServerPlatformBase.JMX_REGISTER_DEV_MBEAN_PROPERTY,
+            XMLPlatformFactory.XML_PLATFORM_PROPERTY};
+    private final static Set<String> legalPropertiesSet = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(legalProperties)));
+
     private static Map<String, Class> primitiveClasses;
 
     static {
@@ -357,10 +376,9 @@ public class PrivilegedAccessHelper {
      *         or {@code false} otherwise.
      */
     private static boolean isIllegalProperty(final String key) {
-        return key == null || !(key.startsWith("eclipselink.") || "line.separator".equals(key)
+        return key == null || !(legalPropertiesSet.contains(key) || key.startsWith("eclipselink.")
                 || key.startsWith("javax.persistence.") || key.startsWith("org.eclipse.persistence.")
-                || key.startsWith("persistence.") || key.startsWith("javax.xml.")
-                || PersistenceUnitProperties.JAVASE_DB_INTERACTION.equals(key));
+                || key.startsWith("persistence.") || key.startsWith("javax.xml."));
     }
 
     /**


=====================================
org/eclipse/persistence/internal/weaving/WeaverLogger.java deleted
=====================================
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
- * which accompanies this distribution.
- * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *     06/08/2015-2.6 Tomas Kraus
- *       - initial API and implementation.
- ******************************************************************************/
-package org.eclipse.persistence.internal.weaving;
-
-import java.security.AccessController;
-
-import org.eclipse.persistence.internal.localization.LoggingLocalization;
-import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
-import org.eclipse.persistence.internal.security.PrivilegedGetSystemProperty;
-import org.eclipse.persistence.logging.AbstractSessionLog;
-import org.eclipse.persistence.logging.SessionLog;
-
-/**
- * INTERNAL:
- * Log to EclipseLink {@code weaver} logger and optionally to standard error output
- * when {@code org.eclipse.persistence.jpa.weaving.log.stderr} JVM system property is set.
- * Logger API is based on {@link SessionLog} with {@code SessionLog.WEAVER} as EclipseLink logging category.
- * @since 2.6.1
- * @deprecated This is minimal temporary solution for 2.6. Will be removed in 2.7.
- */
-public class WeaverLogger {
-
-    /** Logger. */
-    private static final SessionLog LOGGER = AbstractSessionLog.getLog();
-
-    /** Name of property that turns standard error output on or off. */
-    private static final String PROPERTY_NAME = "org.eclipse.persistence.jpa.weaving.log.stderr";
-
-    /** {@link String} to separate logging category from message text in standard error output. */
-    private static final String CATEGORY_SEPARATOR = ": ";
-
-    /** {@link String} to prefix stack trace message in standard error output. */
-    private static final String STACK_TRACE_PREFIX = " - ";
-
-    /** Standard error output trigger. */
-    private static final boolean doLogStdErr = initDoLogStdErr();
-
-    /**
-     * INTERNAL:
-     * Initialize standard error output trigger.
-     * @return Standard error output trigger value depending on {@code org.eclipse.persistence.jpa.weaving.log.stderr}
-     *         system property value.
-     */
-    private static boolean initDoLogStdErr() {
-        if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return Boolean.valueOf(AccessController.doPrivileged(new PrivilegedGetSystemProperty(PROPERTY_NAME)));
-        } else {
-            return Boolean.valueOf(System.getProperty(PROPERTY_NAME));
-        }
-    }
-
-    /**
-     * INTERNAL:
-     * Check if a message of the given level would actually be logged by EclipseLink {@code weaver} logger
-     * or to standard error output.
-     * @param level    The log request level value.
-     * @return Value of {@code true} if message  will be logged or {@code false} otherwise.
-     */
-    public static final boolean shouldLog(final int level) {
-        return doLogStdErr || LOGGER.shouldLog(level, SessionLog.WEAVER);
-    }
-
-    /**
-     * INTERNAL:
-     * Check if a message of the given level would actually be logged by EclipseLink logger or to standard error output.
-     * @param level    The log request level value.
-     * @param category The EclipseLink logging category.
-     * @return Value of {@code true} if message  will be logged or {@code false} otherwise.
-     */
-    public static final boolean shouldLog(final int level, final String category) {
-        return doLogStdErr || LOGGER.shouldLog(level, category);
-    }
-
-    /**
-     * INTERNAL:
-     * Log message to standard error output.
-     * @param category   The EclipseLink logging category.
-     * @param messageKey The {@link TraceLocalizationResource} log message key.
-     * @param arguments  Arguments of the log message.
-     */
-    private static void logStdErr(
-            final String category, final String messageKey, final Object... arguments) {
-        final String message = arguments == null || arguments.length == 0 ?
-                LoggingLocalization.buildMessage(messageKey) : LoggingLocalization.buildMessage(messageKey, arguments);
-        final int messageLength = message != null ? message.length() : 0;
-        final StringBuilder sb = new StringBuilder(category.length() + CATEGORY_SEPARATOR.length() + messageLength);
-        sb.append(category);
-        sb.append(CATEGORY_SEPARATOR);
-        if (messageLength > 0) {
-            sb.append(message);
-        }
-        System.err.println(sb.toString());
-    }
-
-    /**
-     * INTERNAL:
-     * Log message to standard error output.
-     * @param category  The EclipseLink logging category.
-     * @param throwable {@link Throwable} to be logged.
-     */
-    private static void logThrowableStdErr(final String category, final Throwable throwable) {
-        final int categoryLength = category != null ? category.length() + CATEGORY_SEPARATOR.length() : 0;
-        for (StackTraceElement ste : throwable.getStackTrace()) {
-            final String message = ste.toString();
-            StringBuilder sb = new StringBuilder(categoryLength + STACK_TRACE_PREFIX.length() + message.length());
-            if (categoryLength > 0) {
-                sb.append(category);
-                sb.append(CATEGORY_SEPARATOR);
-            }
-            sb.append(STACK_TRACE_PREFIX);
-            sb.append(message);
-            System.err.println(sb.toString());
-        }
-    }
-
-    /**
-     * INTERNAL:
-     * Log message with no arguments to EclipseLink {@code weaver} logger and standard error output.
-     * @param level      The log request level value.
-     * @param messageKey The {@link TraceLocalizationResource} log message key.
-     */
-    public static final void log(final int level, final String messageKey) {
-        LOGGER.log(level, SessionLog.WEAVER, messageKey, null);
-        if (doLogStdErr) {
-            logStdErr(SessionLog.WEAVER, messageKey);
-        }
-    }
-
-    /**
-     * INTERNAL:
-     * Log message with arguments array to EclipseLink {@code weaver} logger and standard error output.
-     * @param level      The log request level value.
-     * @param messageKey {@link TraceLocalizationResource} message key.
-     * @param arguments  Arguments of the log message.
-     */
-    public static final void log(final int level, final String messageKey, final Object... arguments) {
-        LOGGER.log(level, SessionLog.WEAVER, messageKey, arguments);
-        if (doLogStdErr) {
-            logStdErr(SessionLog.WEAVER, messageKey, arguments);
-        }
-    }
-
-    /**
-     * INTERNAL:
-     * Log {@link Throwable} to EclipseLink {@code weaver} logger and standard error output.
-     * @param level     The log request level value.
-     * @param exception {@link Throwable} to be logged.
-     */
-    public static final void logThrowable(final int level, final Throwable throwable) {
-        LOGGER.logThrowable(level, SessionLog.WEAVER, throwable);
-        if (doLogStdErr) {
-            logThrowableStdErr(SessionLog.WEAVER, throwable);
-        }
-    }
-
-}



View it on GitLab: https://salsa.debian.org/java-team/eclipselink/commit/975d838d2dab4f02febe849f33dc1db7864ec806

-- 
View it on GitLab: https://salsa.debian.org/java-team/eclipselink/commit/975d838d2dab4f02febe849f33dc1db7864ec806
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20181231/3a436f71/attachment.html>


More information about the pkg-java-commits mailing list