| /* |
| * Copyright (c) 1997, 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 v. 2.0, which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * This Source Code may also be made available under the following Secondary |
| * Licenses when the conditions for such availability set forth in the |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, |
| * version 2 with the GNU Classpath Exception, which is available at |
| * https://www.gnu.org/software/classpath/license.html. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 |
| */ |
| |
| /* |
| * JDOHelper.java |
| * |
| * Created on April 18, 2000 |
| */ |
| |
| package com.sun.jdo.api.persistence.support; |
| |
| import java.util.ResourceBundle; |
| import java.util.Collection; |
| |
| import org.glassfish.persistence.common.I18NHelper; |
| |
| /** |
| * @author Martin Zaun |
| * @version 0.1 |
| */ |
| |
| /** |
| * An utility class for querying <code>PersistenceCapable</code> objects. |
| */ |
| public class JDOHelper |
| { |
| /** |
| * Returns the associated PersistenceManager of an object if there is one. |
| * |
| * For transactional and persistent objects, their associated |
| * <code>PersistenceManager</code> is returned. |
| * For transient objects, <code>null</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return the PersistenceManager associated with the object; |
| * <code>null</code> otherwise |
| * @see PersistenceCapable#jdoGetPersistenceManager() |
| */ |
| static public PersistenceManager getPersistenceManager(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoGetPersistenceManager(); |
| return null; |
| } |
| |
| /** |
| * Explicitly marks a field of an object as dirty if the object is |
| * persistent and transactional. |
| * |
| * Normally, PersistenceCapable classes are able to detect changes made |
| * to their fields. However, if a reference to an Array is given to a |
| * method outside the class, and the Array is modified, then the |
| * persistent object is not aware of the change. This method allows the |
| * application to notify the object that a change was made to a field. |
| * For transient objects, this method does nothing. |
| * |
| * @param obj an object |
| * @param fieldName the name of the object's field to be marked |
| * dirty |
| * @see PersistenceCapable#jdoMakeDirty(String fieldName) |
| */ |
| static public void makeDirty(Object obj, String fieldName) |
| { |
| if (obj instanceof PersistenceCapable) |
| ((PersistenceCapable)obj).jdoMakeDirty(fieldName); |
| } |
| |
| /** |
| * Returns a copy of the JDO identity associated with an object. |
| * |
| * Persistent objects of PersistenceCapable classes have a JDO identity |
| * managed by the PersistenceManager. This method returns a copy of the |
| * ObjectId that represents the JDO identity of a persistent object. |
| * For transient objects, <code>null</code> is returned. |
| *<P> |
| * The ObjectId may be serialized and later restored, and used with |
| * a PersistenceManager from the same JDO implementation to locate a |
| * persistent object with the same data store identity. |
| * If the JDO identity is managed by the application, then the |
| * ObjectId may be used with a PersistenceManager from any JDO |
| * implementation that supports the PersistenceCapable class. |
| * If the JDO identity is not managed by the application or the |
| * data store, then the ObjectId returned is only valid within the |
| * current transaction. |
| * |
| * @param obj an <code>Object</code> |
| * @return a copy of the ObjectId of a persistent object; |
| * <code>null</code> if the object is transient |
| * @see PersistenceCapable#jdoGetObjectId() |
| * @see PersistenceManager#getObjectId(Object obj) |
| * @see PersistenceManager#getObjectById(Object oid) |
| */ |
| static public Object getObjectId(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoGetObjectId(); |
| return null; |
| } |
| |
| /** |
| * Tests whether an object is dirty. |
| * |
| * If the object have been modified, deleted, or newly |
| * made persistent in the current transaction, <code>true</code> is returned. |
| * For transient objects, <code>false</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return <code>true</code> if the object has been modified |
| * in the current transaction; <code>false</code> |
| * otherwise. |
| * @see PersistenceCapable#jdoIsDirty() |
| * @see PersistenceCapable#jdoMakeDirty(String fieldName) |
| */ |
| static public boolean isDirty(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoIsDirty(); |
| return false; |
| } |
| |
| /** |
| * Tests whether an object is transactional. |
| * |
| * For objects that respect transaction boundaries, <code>true</code> is |
| * returned. |
| * These objects include transient objects made transactional as a |
| * result of being the target of a makeTransactional method call; newly |
| * made persistent or deleted persistent objects; persistent objects |
| * read in data store transactions; and persistent objects modified in |
| * optimistic transactions. |
| * For non-transactional objects, <code>false</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return <code>true</code> if the object is transactional; |
| * <code>false</code> otherwise. |
| * @see PersistenceCapable#jdoIsTransactional() |
| */ |
| static public boolean isTransactional(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoIsTransactional(); |
| return false; |
| } |
| |
| /** |
| * Tests whether an object is persistent. |
| * |
| * For objects whose state is stored in the data store, <code>true</code> |
| * is returned. |
| * For transient objects, <code>false</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return <code>true</code> if the object is persistent; |
| * <code>false</code> otherwise. |
| * @see PersistenceCapable#jdoIsPersistent() |
| * @see PersistenceManager#makePersistent(Object obj) |
| */ |
| static public boolean isPersistent(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoIsPersistent(); |
| return false; |
| } |
| |
| /** |
| * Tests whether the object has been newly made persistent. |
| * |
| * For objects that have been made persistent in the current transaction, |
| * <code>true</code> is returned. |
| * For transient or objects, <code>false</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return <code>true</code> if the object was made persistent |
| * in the current transaction; |
| * <code>false</code> otherwise. |
| * @see PersistenceCapable#jdoIsNew() |
| * @see PersistenceManager#makePersistent(Object obj) |
| */ |
| static public boolean isNew(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoIsNew(); |
| return false; |
| } |
| |
| /** |
| * Tests whether the object has been deleted. |
| * |
| * For objects that have been deleted in the current transaction, |
| * <code>true</code> is returned. |
| * For transient objects, <code>false</code> is returned. |
| * |
| * @param obj an <code>Object</code> |
| * @return <code>true</code> if the object was deleted in the |
| * current transaction; |
| * <code>false</code> otherwise. |
| * @see PersistenceCapable#jdoIsDeleted() |
| * @see PersistenceManager#deletePersistent(Object obj) |
| */ |
| static public boolean isDeleted(Object obj) |
| { |
| if (obj instanceof PersistenceCapable) |
| return ((PersistenceCapable)obj).jdoIsDeleted(); |
| return false; |
| } |
| |
| /** |
| * I18N message handler |
| */ |
| private final static ResourceBundle messages = I18NHelper.loadBundle( |
| "com.sun.jdo.spi.persistence.support.sqlstore.impl.Bundle", // NOI18N |
| JDOHelper.class.getClassLoader()); |
| |
| /** |
| * Help string |
| */ |
| static final String null_instance = "null"; //NOI18N |
| |
| /** |
| * Prints the object. |
| * If object is not NULL and is not deleted, calls toString() method |
| * on the object. |
| * Does not allow to access fields of the deleted object |
| */ |
| static public String printObject(Object o) { |
| if (o==null) |
| return null_instance; |
| else if (isDeleted(o)) |
| return I18NHelper.getMessage(messages, "jdohelper.deleted_instance", //NOI18N |
| o.getClass().getName()); |
| else |
| return o.toString(); |
| } |
| |
| /** Returns the class loader for the class of the object. |
| * If object is an instance of the java.util.Collection or |
| * an Array it is recursively checked for the class loader |
| * of its elements. |
| * |
| * @param obj the object to get the class loader for |
| * @return the class loader that loaded the class or interface |
| * represented by this object. |
| */ |
| static private ClassLoader getObjectClassLoader(Object obj) { |
| Class clazz = obj.getClass(); |
| |
| if (obj instanceof Collection) { |
| return getCollectionClassLoader((Collection)obj); |
| } else if (clazz.isArray()) { |
| return getArrayClassLoader((Object[])obj); |
| } else { |
| return clazz.getClassLoader(); |
| } |
| } |
| |
| /** Returns the class loader for the elements of the collection. |
| * If element is itself an instance of the java.util.Collection or |
| * an Array it is recursively checked for its class loader. |
| * |
| * @param col collection of objects to get the class loader for |
| * @return the class loader that loaded the class or interface |
| * represented by its elements. |
| */ |
| static private ClassLoader getCollectionClassLoader (Collection col) { |
| Object[] arr = col.toArray(); |
| return getArrayClassLoader(arr); |
| } |
| |
| /** Returns the first not null class loader for the elements of the |
| * object array. |
| * If element is itself an instance of the java.util.Collection or |
| * an Array it is recursively checked for its class loader. |
| * |
| * @param arr array of objects to get the class loader for |
| * @return the class loader that loaded the class or interface |
| * represented by its elements. |
| */ |
| static private ClassLoader getArrayClassLoader (Object[] arr) { |
| ClassLoader cl = null; |
| |
| for (int i = 0; i < arr.length; i++) { |
| cl = getObjectClassLoader(arr[i]); |
| if (cl != null) { |
| break; |
| } |
| } |
| return cl; |
| } |
| } |