blob: 9c835f6b791aacce4a800f5293037da6a55c582e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 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:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.internal.history;
import org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform;
import org.eclipse.persistence.internal.helper.*;
/**
* INTERNAL:
* An impersonating database table is one that pretends to be another database
* table, and whose true identity is revealed only when printed as SQL.
* <p>
* a.k.a HistoricalDatabaseTable, DisguisedDatabaseTable
* <p>
* More precisely, if a is impersonating b, (a.equals(b) == true) but
* (a.getQualifiedName().equals(b.getQualifiedName()) == false).
* <p>
* This class is used in temporal versioning, where every update to one table
* triggers an update to a nearly identical historical table. This second update
* is almost identical to the first, save that the table names are
* different (i.e. EMPLOYEE -> EMPLOYEE_HIST). It is much easier just to switch
* the table names at the last minute, as database fields in the descriptors
* and expressions have hardcoded table names.
* @since OracleAS TopLink 10<i>g</i> (10.1.3)
* @author Stephen McRitchie
*/
public class HistoricalDatabaseTable extends DatabaseTable {
protected String historicalName;
protected String historicalNameDelimited;
public HistoricalDatabaseTable() {
super();
}
public HistoricalDatabaseTable(String name, String qualifier) {
super(name, qualifier);
}
public HistoricalDatabaseTable(String possiblyQualifiedName) {
super(possiblyQualifiedName);
}
/**
* Constructs a new database table which appears as <code>guise</code> but
* in fact really is <code>identity</code>.
*/
public HistoricalDatabaseTable(DatabaseTable source, DatabaseTable mirroring, DatasourcePlatform platform) {
super(source.getName(), source.getTableQualifier());
this.historicalName = mirroring.getQualifiedName();
if(mirroring.shouldUseDelimiters()) {
this.historicalNameDelimited = mirroring.getQualifiedNameDelimited(platform);
}
}
public void setHistoricalName(String name) {
if (name.startsWith(Helper.getDefaultStartDatabaseDelimiter()) && name.endsWith(Helper.getDefaultEndDatabaseDelimiter())) {
this.historicalNameDelimited = name;
this.historicalName = this.historicalNameDelimited.replaceAll(Helper.getDefaultStartDatabaseDelimiter(), "");
this.historicalName = this.historicalName.replaceAll(Helper.getDefaultEndDatabaseDelimiter(), "");
} else {
this.historicalName = name ;
}
}
public String getQualifiedName() {
if (historicalName != null) {
return historicalName;
} else {
return super.getQualifiedName();
}
}
public String getQualifiedNameDelimited(DatasourcePlatform platform) {
if (historicalNameDelimited != null) {
return historicalNameDelimited;
} else if(historicalName != null) {
return historicalName;
} else {
return super.getQualifiedNameDelimited(platform);
}
}
}