org.eclipse.persistence.jaxb.compiler.UnmarshalCallback Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.persistence.moxy
Show all versions of org.eclipse.persistence.moxy
EclipseLink build based upon Git transaction fe64cd39c3
/*******************************************************************************
* 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.jaxb.compiler;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import javax.xml.bind.Unmarshaller;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
import org.eclipse.persistence.internal.security.PrivilegedClassForName;
import org.eclipse.persistence.internal.security.PrivilegedGetMethod;
/**
* INTERNAL:
* Purpose:Hold information about class based JAXB 2.0 Callback methods
*
Responsibilities:
* - Store information about domainClass and the callback methods
* - Act as a means to integrate JAXB 2.0 Class based callbacks with TopLink OXM
* Listener based callbacks.
*
* A Map of UnmarshalCallbacks are created during JAXB 2.0 Generation and are set on a
* JAXBUnmarshallerListener on each JAXBUnmarshaller. These callbacks are used to invoke
* the JAXB 2.0 Class Based callbacks on each object at the appropriate time.
*
* @author mmacivor
* @since Oracle TopLink 11.1.1.0.0
* @see org.eclipse.persistence.jaxb.JAXBUnmarshalListener
* @see org.eclipse.persistence.jaxb.JAXBUnmarshaller
*/
public class UnmarshalCallback {
private Class domainClass;
private String domainClassName;
private Method afterUnmarshalCallback;
private Method beforeUnmarshalCallback;
private boolean hasAfterUnmarshalCallback = false;
private boolean hasBeforeUnmarshalCallback = false;
public Method getAfterUnmarshalCallback() {
return afterUnmarshalCallback;
}
public Method getBeforeUnmarshalCallback() {
return beforeUnmarshalCallback;
}
public Class getDomainClass() {
return domainClass;
}
/**
* @param loader
*/
public void initialize(ClassLoader loader) {
try {
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
try{
domainClass = (Class)AccessController.doPrivileged(new PrivilegedClassForName(domainClassName, true, loader));
}catch (PrivilegedActionException ex){
if (ex.getCause() instanceof ClassNotFoundException){
throw (ClassNotFoundException) ex.getCause();
}
throw (RuntimeException)ex.getCause();
}
}else{
domainClass = PrivilegedAccessHelper.getClassForName(domainClassName, true, loader);
}
} catch (ClassNotFoundException ex) {
return;
}
Class[] params = new Class[]{ Unmarshaller.class, Object.class };
if (hasBeforeUnmarshalCallback) {
try {
Method beforeUnmarshal = null;
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
try{
beforeUnmarshal = (Method)AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "beforeUnmarshal", params, false));
}catch (PrivilegedActionException ex){
if (ex.getCause() instanceof NoSuchMethodException){
throw (NoSuchMethodException) ex.getCause();
}
throw (RuntimeException)ex.getCause();
}
}else{
beforeUnmarshal = PrivilegedAccessHelper.getMethod(domainClass, "beforeUnmarshal", params, false);
}
setBeforeUnmarshalCallback(beforeUnmarshal);
} catch (NoSuchMethodException nsmex) {}
}
if (hasAfterUnmarshalCallback) {
try {
Method afterUnmarshal = null;
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
try{
afterUnmarshal = (Method)AccessController.doPrivileged(new PrivilegedGetMethod(domainClass, "afterUnmarshal", params, false));
}catch (PrivilegedActionException ex){
if (ex.getCause() instanceof NoSuchMethodException){
throw (NoSuchMethodException) ex.getCause();
}
throw (RuntimeException)ex.getCause();
}
}else{
afterUnmarshal = PrivilegedAccessHelper.getMethod(domainClass, "afterUnmarshal", params, false);
}
setAfterUnmarshalCallback(afterUnmarshal);
} catch (NoSuchMethodException nsmex) {}
}
}
/**
* Should not use this method - the init method will
* overwrite the set value.
*/
public void setAfterUnmarshalCallback(Method method) {
afterUnmarshalCallback = method;
}
public void setHasAfterUnmarshalCallback() {
hasAfterUnmarshalCallback = true;
}
/**
* Should not use this method - the init method will
* overwrite the set value.
*/
public void setBeforeUnmarshalCallback(Method method) {
beforeUnmarshalCallback = method;
}
public void setHasBeforeUnmarshalCallback() {
hasBeforeUnmarshalCallback = true;
}
/**
* Should use setDomainClassName - the init method will overwrite
* the set value with Class.forName(domainClassName)
*
* @param clazz
*/
public void setDomainClass(Class clazz) {
domainClass = clazz;
setDomainClassName(clazz.getName());
}
public void setDomainClassName(String className) {
domainClassName = className;
}
}