[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