/*
 * Copyright (c) 1998, 2021 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 v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.sessions.remote.corba.sun;

import java.util.Hashtable;
import org.eclipse.persistence.internal.sessions.remote.Transporter;

/**
* INTERNAL:
* org/eclipse/persistence/remote/corba/sun/_CORBARemoteSessionControllerImplBase.java
* Generated by the IDL-to-Java compiler (portable), version "3.0"
* from d:/StarTeam/DIDev/Pine/TopLink/DISource/IDLs/CorbaRemoteSessionControllerSun.idl
* Thursday, May 3, 2001 1:36:59 PM EDT
*/
public abstract class _CORBARemoteSessionControllerImplBase extends org.omg.CORBA.portable.ObjectImpl implements CORBARemoteSessionController, org.omg.CORBA.portable.InvokeHandler {
    // Constructors
    public _CORBARemoteSessionControllerImplBase() {
    }

    private static final Hashtable<String, Integer> _methods = new Hashtable<>();

    static {
        _methods.put("getLogin", 2);
        _methods.put("scrollableCursorCurrentIndex", 5);
        _methods.put("commitRootUnitOfWork", 6);
        _methods.put("scrollableCursorAbsolute", 8);
        _methods.put("cursoredStreamNextPage", 10);
        _methods.put("executeQuery", 14);
        _methods.put("scrollableCursorFirst", 15);
        _methods.put("scrollableCursorAfterLast", 18);
        _methods.put("cursoredStreamClose", 19);
        _methods.put("getSequenceNumberNamed", 22);
        _methods.put("scrollableCursorClose", 24);
        _methods.put("processCommand", 25);
        _methods.put("cursorSelectObjects", 27);
        _methods.put("scrollableCursorLast", 29);
        _methods.put("executeNamedQuery", 31);
        _methods.put("scrollableCursorBeforeFirst", 33);
        _methods.put("scrollableCursorIsBeforeFirst", 34);
        _methods.put("beginTransaction", 35);
        _methods.put("initializeIdentityMapsOnServerSession", 36);
        _methods.put("scrollableCursorIsLast", 37);
        _methods.put("scrollableCursorSize", 38);
        _methods.put("scrollableCursorIsFirst", 39);
        _methods.put("getDescriptor", 40);
        _methods.put("cursoredStreamSize", 41);
        _methods.put("scrollableCursorRelative", 42);
        _methods.put("commitTransaction", 45);
        _methods.put("rollbackTransaction", 47);
        _methods.put("instantiateRemoteValueHolderOnServer", 52);
        _methods.put("scrollableCursorNextObject", 53);
        _methods.put("scrollableCursorIsAfterLast", 54);
        _methods.put("getDefaultReadOnlyClasses", 56);
        _methods.put("scrollableCursorPreviousObject", 57);
        _methods.put("getDescriptorForAlias", 58);
        _methods.put("beginEarlyTransaction", 59);
    }

    @Override
    public org.omg.CORBA.portable.OutputStream _invoke(String method, org.omg.CORBA.portable.InputStream in, org.omg.CORBA.portable.ResponseHandler rh) {
        org.omg.CORBA.portable.OutputStream out = null;
        Integer __method = _methods.get(method);
        if (__method == null) {
            throw new org.omg.CORBA.BAD_OPERATION(0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
        }

        switch (__method) {
        case 2:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/getLogin
         {
            Transporter __result = this.getLogin();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 5:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorCurrentIndex
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorCurrentIndex(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 6:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/commitRootUnitOfWork
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.commitRootUnitOfWork(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 8:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorAbsolute
         {
            Transporter arg0 = TransporterHelper.read(in);
            int arg1 = in.read_long();
            Transporter __result = this.scrollableCursorAbsolute(arg0, arg1);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 10:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/cursoredStreamNextPage
         {
            Transporter arg0 = TransporterHelper.read(in);
            int arg1 = in.read_long();
            Transporter __result = this.cursoredStreamNextPage(arg0, arg1);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 14:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/executeQuery
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.executeQuery(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 15:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorFirst
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorFirst(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 18:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorAfterLast
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorAfterLast(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 19:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/cursoredStreamClose
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.cursoredStreamClose(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 22:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/getSequenceNumberNamed
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.getSequenceNumberNamed(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 24:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorClose
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorClose(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 25:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/processCommand
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.processCommand(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 27:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/cursorSelectObjects
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.cursorSelectObjects(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 29:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorLast
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorLast(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 31:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/executeNamedQuery
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter arg1 = TransporterHelper.read(in);
            Transporter arg2 = TransporterHelper.read(in);
            Transporter __result = this.executeNamedQuery(arg0, arg1, arg2);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 33:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorBeforeFirst
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorBeforeFirst(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 34:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorIsBeforeFirst
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorIsBeforeFirst(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 35:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/beginTransaction
         {
            Transporter __result = this.beginTransaction();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 36:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/initializeIdentityMapsOnServerSession
         {
            Transporter __result = this.initializeIdentityMapsOnServerSession();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 37:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorIsLast
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorIsLast(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 38:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorSize
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorSize(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 39:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorIsFirst
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorIsFirst(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 40:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/getDescriptor
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.getDescriptor(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 41:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/cursoredStreamSize
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.cursoredStreamSize(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 42:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorRelative
         {
            Transporter arg0 = TransporterHelper.read(in);
            int arg1 = in.read_long();
            Transporter __result = this.scrollableCursorRelative(arg0, arg1);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 45:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/commitTransaction
         {
            Transporter __result = this.commitTransaction();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 47:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/rollbackTransaction
         {
            Transporter __result = this.rollbackTransaction();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 52:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/instantiateRemoteValueHolderOnServer
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.instantiateRemoteValueHolderOnServer(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 53:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorNextObject
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorNextObject(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 54:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorIsAfterLast
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorIsAfterLast(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 56:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/getDefaultReadOnlyClasses
         {
            Transporter __result = this.getDefaultReadOnlyClasses();
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 57:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/scrollableCursorPreviousObject
         {
            Transporter arg0 = TransporterHelper.read(in);
            Transporter __result = this.scrollableCursorPreviousObject(arg0);
            out = rh.createReply();
            TransporterHelper.write(out, __result);
            break;
        }
        case 58:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/getDescriptorForAlias
        {
           Transporter arg0 = TransporterHelper.read(in);
           Transporter __result = this.getDescriptorForAlias(arg0);
           out = rh.createReply();
           TransporterHelper.write(out, __result);
           break;
       }
        case 59:// org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController/beginEarlyTransaction
        {
           Transporter __result = this.beginEarlyTransaction();
           out = rh.createReply();
           TransporterHelper.write(out, __result);
           break;
       }
        default:
            throw new org.omg.CORBA.BAD_OPERATION(0, org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
        }

        return out;
    }
    // _invoke

    // Type-specific CORBA::Object operations
    private static final String[] __ids = { "IDL:org/eclipse/persistence/remote/corba/sun/CORBARemoteSessionController:1.0" };

    @Override
    public String[] _ids() {
        return __ids;
    }
}// class _CORBARemoteSessionControllerImplBase
