/******************************************************************************* * Copyright (c) 1998, 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: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.internal.expressions; import java.io.*; import java.util.HashSet; import java.util.Collection; import org.eclipse.persistence.queries.ObjectBuildingQuery; /** * <b>Purpose:</b>Represents The FOR UPDATE pessimistically locking clause. * @author Stephen McRitchie * @since Oracle Toplink 10g AS */ public class ForUpdateClause implements Serializable, Cloneable { protected static final ForUpdateClause NO_LOCK_CLAUSE = new ForUpdateClause(); short lockMode; Integer waitTimeout; public ForUpdateClause() { this.lockMode = ObjectBuildingQuery.NO_LOCK; } public ForUpdateClause(short lockMode) { this.lockMode = lockMode; } public ForUpdateClause(Integer waitTimeout) { this.lockMode = ObjectBuildingQuery.LOCK; this.waitTimeout = waitTimeout; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException never) { return null; } } public static ForUpdateClause newInstance(short lockMode) { if (lockMode == ObjectBuildingQuery.NO_LOCK) { return NO_LOCK_CLAUSE; } else { return new ForUpdateClause(lockMode); } } public static ForUpdateClause newInstance(Integer waitTimeout) { return new ForUpdateClause(waitTimeout); } public boolean isForUpdateOfClause() { return false; } public boolean isReferenceClassLocked() { return true; } public short getLockMode() { return lockMode; } public Integer getWaitTimeout() { return waitTimeout; } /** * INTERNAL: * Prints the as of clause for an expression inside of the FROM clause. */ public void printSQL(ExpressionSQLPrinter printer, SQLSelectStatement statement) { // Append lock strings if (getLockMode() == ObjectBuildingQuery.LOCK) { if (waitTimeout == null) { printer.printString(printer.getPlatform().getSelectForUpdateString()); } else { printer.printString(printer.getPlatform().getSelectForUpdateWaitString(waitTimeout)); } } else if (lockMode == ObjectBuildingQuery.LOCK_NOWAIT) { printer.printString(printer.getPlatform().getSelectForUpdateNoWaitString()); } } /** * INTERNAL: * Returns collection of aliases of the tables to be locked. * Only used by platforms that lock tables individually in FROM clause * (platform.shouldPrintLockingClauseAfterWhereClause()==false) * like SQLServer */ public Collection getAliasesOfTablesToBeLocked(SQLSelectStatement statement) { return new HashSet(statement.getTableAliases().keySet()); } }