blob: e004107bec1542d923be632561d0e191f5d52a63 [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.sequencing;
import java.util.Hashtable;
import org.eclipse.persistence.internal.sequencing.Sequencing;
import org.eclipse.persistence.internal.sessions.remote.RemoteConnection;
import org.eclipse.persistence.internal.sessions.remote.RemoteFunctionCall;
import org.eclipse.persistence.internal.sessions.remote.SequencingFunctionCall;
/*
* RemoteConnectionSequencing class provides Sequencing through RemoteConnection.
* It caches some info and communicates with Sequencing object
* on its master session by sending SequencingFunctionCall objects
* through the RemoteConnection.
* Note that individual SequencingFunctionCalls
* are implemented as static inner classes in SequenceFunctionCall class:
* like SequencingFunctionCall.DoesExist.
*/
class RemoteConnectionSequencing implements Sequencing {
protected RemoteConnection remoteConnection;
protected Hashtable classToShouldAcquireValueAfterInsert;
protected int whenShouldAcquireValueForAll;
public static boolean masterSequencingExists(RemoteConnection con) {
return ((Boolean)con.getSequenceNumberNamed(new SequencingFunctionCall.DoesExist())).booleanValue();
}
public RemoteConnectionSequencing(RemoteConnection remoteConnection) {
this.remoteConnection = remoteConnection;
whenShouldAcquireValueForAll = ((Integer)processFunctionCall(new SequencingFunctionCall.WhenShouldAcquireValueForAll())).intValue();
if (whenShouldAcquireValueForAll == UNDEFINED) {
classToShouldAcquireValueAfterInsert = new Hashtable(20);
}
}
public int whenShouldAcquireValueForAll() {
return whenShouldAcquireValueForAll;
}
public Object getNextValue(Class cls) {
return processFunctionCall(new SequencingFunctionCall.GetNextValue(cls));
}
protected Object processFunctionCall(RemoteFunctionCall call) {
return remoteConnection.getSequenceNumberNamed(call);
}
}