org.eclipse.persistence.descriptors.SchemaPerMultitenantPolicy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of eclipselink Show documentation
Show all versions of eclipselink Show documentation
EclipseLink build based upon Git transaction f2b9fc5
/*
* Copyright (c) 2014, 2024 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:
// 19/12/2014 - 2.6.0 - Lukas Jungmann
// - 455905: initial implementation
package org.eclipse.persistence.descriptors;
import org.eclipse.persistence.annotations.TenantTableDiscriminatorType;
import org.eclipse.persistence.annotations.CacheIsolationType;
import org.eclipse.persistence.config.EntityManagerProperties;
import org.eclipse.persistence.exceptions.DescriptorException;
import org.eclipse.persistence.internal.helper.DatabaseTable;
import org.eclipse.persistence.internal.sessions.AbstractSession;
/**
* A schema per tenant multitenant policy.
* This is a special case of TablePerMultitenantPolicy which can be applied
* on the project. Can be useful in cases when tenant schema change happens
* outside of EclipseLink, typically if Proxy DataSource is used.
*
* Use of this policy is limited to projects where following applies
*
* - {@literal @}Multitenant entities are not used
*
- EMF is shared across tenants
*
- EMF shared cache is disabled
*
- no {@literal @}Entity defines schema to be used
*
*
* @author Lukas Jungmann
* @since EclipseLink 2.6
*/
//TODO: refactor MTPolicies a bit
public class SchemaPerMultitenantPolicy extends TablePerMultitenantPolicy {
private boolean useSharedCache = false;
private boolean useSharedEMF = true;
public SchemaPerMultitenantPolicy() {
type = TenantTableDiscriminatorType.SCHEMA;
contextProperty = EntityManagerProperties.MULTITENANT_SCHEMA_PROPERTY_DEFAULT;
}
public SchemaPerMultitenantPolicy(ClassDescriptor desc) {
this();
descriptor = desc;
}
/**
* INTERNAL:
*/
@Override
public void initialize(AbstractSession session) throws DescriptorException {
// Add the context property to the session set.
session.addMultitenantContextProperty(contextProperty);
//update caching as needed
if (shouldUseSharedEMF()) {
for (ClassDescriptor classDescriptor : session.getProject().getDescriptors().values()) {
if (shouldUseSharedCache()) {
// Even though it is a shared cache we don't want to
// override an explicit ISOLATED setting from the user.
// Caching details are processed before multitenant metadata.
if (classDescriptor.isSharedIsolation()) {
classDescriptor.setCacheIsolation(CacheIsolationType.PROTECTED);
}
} else {
classDescriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
}
}
session.getProject().setHasIsolatedClasses(true);
}
}
@Override
public MultitenantPolicy clone(ClassDescriptor descriptor) {
try {
SchemaPerMultitenantPolicy clonedPolicy = (SchemaPerMultitenantPolicy) super.clone();
clonedPolicy.descriptor = descriptor;
return clonedPolicy;
} catch (CloneNotSupportedException exception) {
throw new InternalError(exception.getMessage());
}
}
@Override
public boolean isSchemaPerMultitenantPolicy() {
return true;
}
//TODO: should not have to override following methods
@Override
protected void setTableSchemaPerTenant() {
//do nothing, schema is set by the datasource
}
@Override
public boolean isTablePerMultitenantPolicy() {
return false;
}
@Override
protected String getTableName(DatabaseTable table, String tenant) {
return table.getName();
}
@Override
public DatabaseTable getTable(DatabaseTable table) {
return table;
}
@Override
public DatabaseTable getTable(String tableName) {
return new DatabaseTable(tableName);
}
@Override
protected DatabaseTable updateTable(DatabaseTable table) {
//there should be no way to get here but if there is then
throw new UnsupportedOperationException();
}
//TODO: methods bellow should be part of parent class/iface
public boolean shouldUseSharedEMF() {
return useSharedEMF;
}
public void setShouldUseSharedEMF(boolean shouldUseSharedEMF) {
this.useSharedEMF = shouldUseSharedEMF;
}
public boolean shouldUseSharedCache() {
return useSharedCache;
}
public void setShouldUseSharedCache(boolean shouldUseSharedCache) {
this.useSharedCache = shouldUseSharedCache;
}
}