blob: d0b4446ff9e844bdbbdbda630987b99067417f22 [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.internal.sessions.factories;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.exceptions.*;
import org.eclipse.persistence.queries.Call;
import org.eclipse.persistence.eis.EISObjectPersistenceXMLProject;
import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
import org.eclipse.persistence.internal.security.PrivilegedClassForName;
import org.eclipse.persistence.internal.sessions.AbstractSession;
import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
/**
* INTERNAL:
* Event listener class used to lazy-load the descriptors for EIS and XDB,
* as they have external jar dependencies that may not be on the classpath.
*
* @since TopLink 10
* @author James Sutherland
*/
public class MissingDescriptorListener extends SessionEventAdapter {
protected static final String XML_TYPE_CLASS = "org.eclipse.persistence.mappings.xdb.DirectToXMLTypeMapping";
protected static final String EIS_DESCRIPTOR_CLASS = "org.eclipse.persistence.eis.EISDescriptor";
protected static final String XML_INTERACTION_CLASS = "org.eclipse.persistence.eis.interactions.XMLInteraction";
protected static final String EIS_LOGIN_CLASS = "org.eclipse.persistence.eis.EISLogin";
protected static final String XML_BINARY_MAPPING_CLASS = "org.eclipse.persistence.oxm.mappings.XMLBinaryDataMapping";
protected static final String XML_BINARY_COLLECTION_MAPPING_CLASS = "org.eclipse.persistence.oxm.mappings.XMLBinaryDataCollectionMapping";
/**
* Default constructor.
*/
public MissingDescriptorListener() {
}
@Override
public void missingDescriptor(SessionEvent event) {
String name = ((Class<?>)event.getResult()).getName();
DatabaseSession session = (DatabaseSession) ((AbstractSession) event.getSession()).getRootSession(null);
Project project = session.getProject();
String namespaceXPath = "";
NamespaceResolverWithPrefixes namespaceResolverWithPrefixes;
if (project instanceof NamespaceResolvableProject) {
// this should always be true
NamespaceResolvableProject nrpProject = (NamespaceResolvableProject)project;
namespaceXPath = nrpProject.getPrimaryNamespaceXPath();
namespaceResolverWithPrefixes = nrpProject.getNamespaceResolver();
}
else {
// this shouldn't happen - but if it does, build a new (empty) NamespaceResolverWithPrefixes
namespaceResolverWithPrefixes = new NamespaceResolverWithPrefixes();
}
DirectToXMLTypeMappingHelper.getInstance().addXDBDescriptors(name,
(DatabaseSessionImpl)session, namespaceResolverWithPrefixes);
if (name.equals(EIS_DESCRIPTOR_CLASS) || name.equals(XML_INTERACTION_CLASS) || name.equals(EIS_LOGIN_CLASS)) {
try {
Class<?> javaClass;
if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
try{
javaClass = AccessController.doPrivileged(new PrivilegedClassForName<>(XML_INTERACTION_CLASS));
}catch (PrivilegedActionException ex){
if (ex.getCause() instanceof ClassNotFoundException){
throw (ClassNotFoundException) ex.getCause();
}
throw (RuntimeException) ex.getCause();
}
}else{
javaClass = PrivilegedAccessHelper.getClassForName(XML_INTERACTION_CLASS);
}
session.getDescriptor(Call.class).getInheritancePolicy().addClassIndicator(javaClass,
namespaceXPath + "xml-interaction" );
} catch (Exception classLoadFailure) {
throw ValidationException.fatalErrorOccurred(classLoadFailure);
}
session.addDescriptors(new EISObjectPersistenceXMLProject(namespaceResolverWithPrefixes));
}
if(name.equals(XML_BINARY_MAPPING_CLASS) || name.equals(XML_BINARY_COLLECTION_MAPPING_CLASS)) {
session.addDescriptors(new OXMObjectPersistenceRuntimeXMLProject(namespaceResolverWithPrefixes));
}
}
}