com.sun.jdo.api.persistence.support.JDOHelper Maven / Gradle / Ivy
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in compliance with the License. You can
* obtain a copy of the License at
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle designates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your decision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
/*
* 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 PersistenceCapable
objects.
*/
public class JDOHelper
{
/**
* Returns the associated PersistenceManager of an object if there is one.
*
* For transactional and persistent objects, their associated
* PersistenceManager
is returned.
* For transient objects, null
is returned.
*
* @param obj an Object
* @return the PersistenceManager associated with the object;
* null
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, null
is returned.
*
* 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 Object
* @return a copy of the ObjectId of a persistent object;
* null
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, true
is returned.
* For transient objects, false
is returned.
*
* @param obj an Object
* @return true
if the object has been modified
* in the current transaction; false
* 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, true
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, false
is returned.
*
* @param obj an Object
* @return true
if the object is transactional;
* false
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, true
* is returned.
* For transient objects, false
is returned.
*
* @param obj an Object
* @return true
if the object is persistent;
* false
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,
* true
is returned.
* For transient or objects, false
is returned.
*
* @param obj an Object
* @return true
if the object was made persistent
* in the current transaction;
* false
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,
* true
is returned.
* For transient objects, false
is returned.
*
* @param obj an Object
* @return true
if the object was deleted in the
* current transaction;
* false
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;
}
}