blob: 0364a9bfaf7893d656f07d8847076bcbd91f2f65 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 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,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.sdo.helper;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import org.eclipse.persistence.exceptions.SDOException;
import org.eclipse.persistence.internal.security.*;
import org.eclipse.persistence.mappings.DatabaseMapping;
import org.eclipse.persistence.mappings.converters.Converter;
import org.eclipse.persistence.sessions.Session;
/**
* <p><b>Purpose</b>: A converter used in conjunction with sdoJava:instanceClass
* The customClass on the converter must be set and that class must have
* a Constructor that takes a String argument and a toString method.
* Used when the javaClass open content property is set.
*/
public class InstanceClassConverter implements Converter {
private Class<?> customClass;
public InstanceClassConverter() {
}
/**
* Convert the value as required during marshal.
* @param objectValue
* @param session
* @return String value of the given object value, value returned from objectValue.toString
*/
@Override
public Object convertObjectValueToDataValue(Object objectValue, Session session) {
if (objectValue != null) {
return objectValue.toString();
}
return null;
}
/**
* Convert the value from XML as required during unmarshal
* @param dataValue
* @param session
* @return Convert the value from XML by invoking the constructor that takes a spring parameter
*/
@Override
public Object convertDataValueToObjectValue(Object dataValue, Session session) {
if (dataValue != null) {
Class<?>[] params = new Class<?>[1];
params[0] = String.class;
Constructor ctor = null;
try {
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
ctor = AccessController.doPrivileged(new PrivilegedGetDeclaredConstructorFor(customClass, params, true));
} else {
ctor = PrivilegedAccessHelper.getDeclaredConstructorFor(customClass, params, true);
}
Object[] args = new Object[1];
args[0] = dataValue.toString();
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
return AccessController.doPrivileged(new PrivilegedInvokeConstructor(ctor, args));
} else {
return PrivilegedAccessHelper.invokeConstructor(ctor, args);
}
} catch (PrivilegedActionException e) {
throw SDOException.noConstructorWithString(e, customClass.getName());
} catch (NoSuchMethodException e) {
throw SDOException.noConstructorWithString(e, customClass.getName());
} catch (IllegalAccessException e) {
throw SDOException.noConstructorWithString(e, customClass.getName());
} catch (InvocationTargetException e) {
throw SDOException.noConstructorWithString(e, customClass.getName());
} catch (InstantiationException e) {
throw SDOException.noConstructorWithString(e, customClass.getName());
}
}
//throw exception if not string.
return null;
}
@Override
public boolean isMutable() {
return true;
}
@Override
public void initialize(DatabaseMapping mapping, Session session) {
}
public void setCustomClass(Class<?> customClass) {
this.customClass = customClass;
}
public Class<?> getCustomClass() {
return customClass;
}
}