/******************************************************************************* * Copyright (c) 2011, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * 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. */ 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: */ 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()); } } }