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