| /* |
| * Copyright (c) 2011, 2020 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: |
| // 09/09/2011-2.3.1 Guy Pelletier |
| // - 356197: Add new VPD type to MultitenantType |
| // 11/15/2011-2.3.2 Guy Pelletier |
| // - 363820: Issue with clone method from VPDMultitenantPolicy |
| package org.eclipse.persistence.descriptors; |
| |
| import org.eclipse.persistence.descriptors.ClassDescriptor; |
| import org.eclipse.persistence.exceptions.DescriptorException; |
| import org.eclipse.persistence.exceptions.ValidationException; |
| import org.eclipse.persistence.internal.helper.DatabaseField; |
| import org.eclipse.persistence.internal.sessions.AbstractSession; |
| import org.eclipse.persistence.tools.schemaframework.TableDefinition; |
| |
| /** |
| * A vpd multitenant policy. |
| * |
| * @author Guy Pelletier |
| * @since EclipseLink 2.3.1 |
| */ |
| public class VPDMultitenantPolicy extends SingleTableMultitenantPolicy { |
| protected String vpdIdentifier; |
| protected String vpdIdentifierFieldName; |
| |
| public VPDMultitenantPolicy(ClassDescriptor descriptor) { |
| super(descriptor); |
| } |
| |
| /** |
| * INTERNAL: |
| * Return all the tenant id fields. |
| */ |
| @Override |
| public void addTenantDiscriminatorField(String property, DatabaseField field) { |
| super.addTenantDiscriminatorField(property, field); |
| |
| // TODO: we could check for multiple different vpdIdentifiers for the |
| // same policy. Right now, last one in partly wins (i.e. unless another |
| // class sets a vpd identifier different then the last one in here). |
| |
| vpdIdentifier = property; |
| vpdIdentifierFieldName = field.getName(); |
| } |
| |
| /** |
| * INTERNAL: |
| */ |
| @Override |
| public void addToTableDefinition(TableDefinition tableDefinition) { |
| tableDefinition.setCreateVPDCalls(true, vpdIdentifierFieldName); |
| } |
| |
| /** |
| * INTERNAL: |
| */ |
| @Override |
| public MultitenantPolicy clone(ClassDescriptor descriptor) { |
| VPDMultitenantPolicy clonedPolicy = new VPDMultitenantPolicy(descriptor); |
| clonedPolicy.includeTenantCriteria = includeTenantCriteria; |
| clonedPolicy.tenantDiscriminatorFields = tenantDiscriminatorFields; |
| clonedPolicy.vpdIdentifier = vpdIdentifier; |
| clonedPolicy.vpdIdentifierFieldName = vpdIdentifierFieldName; |
| return clonedPolicy; |
| } |
| |
| /** |
| * INTERNAL: |
| * Return the single identifier. |
| */ |
| public String getVPDIdentifier() { |
| return vpdIdentifier; |
| } |
| |
| /** |
| * INTERNAL: |
| * Allow the descriptor to initialize any dependencies on this session. |
| */ |
| @Override |
| public void preInitialize(AbstractSession session) throws DescriptorException { |
| super.preInitialize(session); |
| |
| // Set the VPD identifier and connection queries on the session. |
| String vpdIdentifier = session.getProject().getVPDIdentifier(); |
| |
| if (vpdIdentifier != null) { |
| if (! vpdIdentifier.equals(getVPDIdentifier())) { |
| throw ValidationException.multipleVPDIdentifiersSpecified(vpdIdentifier, session.getProject().getVPDLastIdentifierClassName(), getVPDIdentifier(), getDescriptor().getJavaClassName()); |
| } |
| } else { |
| // Initialize the VPD queries and set them on the project. |
| session.getProject().setVPDIdentifier(getVPDIdentifier()); |
| session.getProject().setVPDLastIdentifierClassName(getDescriptor().getJavaClassName()); |
| } |
| } |
| } |