blob: 685530a2dfa575e3d5ae68b1290f046173e2aa25 [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.sessions.remote;
import java.rmi.server.ObjID;
import org.eclipse.persistence.sessions.remote.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.exceptions.*;
/**
* <p><b>Purpose</b>:
* The object is used as a wrapper to the ScrollableCursor object in the remote transaction (via RMI, CORBA, etc.)
* <p>
* <p><b>Responsibilities</b>:
* Wraps a database result set cursor to provide a stream to the remote client side on the resulting selected objects.
* <p>
* Note: Most of the APIs only work with JDBC 2.0
*
* @author King (Yaoping) Wang
* @since TOPLink/Java 3.0
*/
public class RemoteScrollableCursor extends ScrollableCursor {
/** This is a unique id for remote cursored stream */
protected ObjID id;
/** Return if the stream is closed */
protected boolean isClosed;
public RemoteScrollableCursor(ScrollableCursor serverScrollableCursor) {
this.id = new ObjID();
this.isClosed = serverScrollableCursor.isClosed();
}
/**
* Moves the cursor to the given row number in the result set
*/
public boolean absolute(int rows) throws DatabaseException {
clearNextAndPrevious();
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorAbsolute(getID(), rows);
}
/**
* Moves the cursor to the end of the result set, just after the last row.
*/
public void afterLast() throws DatabaseException {
clearNextAndPrevious();
((DistributedSession)getSession()).getRemoteConnection().scrollableCursorAfterLast(getID());
}
/**
* Moves the cursor to the front of the result set, just before the first row
*/
public void beforeFirst() throws DatabaseException {
clearNextAndPrevious();
((DistributedSession)getSession()).getRemoteConnection().scrollableCursorBeforeFirst(getID());
}
/**
* Close the wrapped cursored stream
* This should be performed whenever the user has finished with the stream.
*/
public void close() throws DatabaseException {
if (isClosed()) {
return;
}
(((DistributedSession)getSession()).getRemoteConnection()).scrollableCursorClose(getID());
// Added for bug 2797683.
this.isClosed = true;
}
/**
* Retrieves the current row index number
*/
public int currentIndex() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorCurrentIndex(getID());
}
/**
* Moves the cursor to the first row in the result set
*/
public boolean first() throws DatabaseException {
clearNextAndPrevious();
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorFirst(getID());
}
/**
* INTERNAL:
* Retreive the size of the wrapped cursored stream.
*/
protected int getCursorSize() {
return (((DistributedSession)getSession()).getRemoteConnection()).scrollableCursorSize(getID());
}
/**
* INTERNAL:
* Retreive the OID of the wrapped cursored stream.
*/
public ObjID getID() {
return this.id;
}
/**
* Indicates whether the cursor is after the last row in the result set.
*/
public boolean isAfterLast() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorIsAfterLast(getID());
}
/**
* Indicates whether the cursor is before the first row in the result set.
*/
public boolean isBeforeFirst() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorIsBeforeFirst(getID());
}
/**
* INTERNAL:
* Return if the stream is closed.
*/
public boolean isClosed() {
return isClosed;
}
/**
* Indicates whether the cursor is on the first row of the result set.
*/
public boolean isFirst() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorIsFirst(getID());
}
/**
* Indicates whether the cursor is on the last row of the result set.
*/
public boolean isLast() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorIsLast(getID());
}
/**
* Moves the cursor to the last row in the result set
*/
public boolean last() throws DatabaseException {
clearNextAndPrevious();
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorLast(getID());
}
/**
* Moves the cursor a relative number of rows, either positive or negative.
* Attempting to move beyond the first/last row in the result set positions the cursor before/after the
* the first/last row
*/
public boolean relative(int rows) throws DatabaseException {
clearNextAndPrevious();
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorRelative(getID(), rows);
}
/**
* INTERNAL:
* This method differs slightly from conventinal read() operation on a Java stream. This
* method return the next object in the collection rather than specifying the number of
* bytes to be read in.
*
* Return the next object from the collection, if beyond the read limit read from the cursor
* @return - next object in stream
* @exception - throws exception if read pass end of stream
*/
protected Object retrieveNextObject() throws DatabaseException, QueryException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorNextObject(getID(), getPolicy().getQuery(), (DistributedSession)getSession());
}
/**
* INTERNAL:
* CR#4139
* Read the previous row from the result set. It is used solely
* for scrollable cursor support.
*/
protected Object retrievePreviousObject() throws DatabaseException {
return ((DistributedSession)getSession()).getRemoteConnection().scrollableCursorPreviousObject(getID(), getPolicy().getQuery(), (DistributedSession)getSession());
}
}