All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.persistence.descriptors.SchemaPerMultitenantPolicy Maven / Gradle / Ivy

There is a newer version: 5.0.0-B03
Show newest version
/*
 * 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; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy