/******************************************************************************* * 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.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()); } }