<!doctype html>
<html>
<head>
<!--
Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

This code is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 only, as
published by the Free Software Foundation.  Oracle designates this
particular file as subject to the "Classpath" exception as provided
by Oracle in the LICENSE file that accompanied this code.

This code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
version 2 for more details (a copy is included in the LICENSE file that
accompanied this code).

You should have received a copy of the GNU General Public License version
2 along with this work; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
or visit www.oracle.com if you need additional information or have any
questions.
-->
</head>
<body>

Provides a portability layer, that is, a set of ORB APIs
that makes it possible for code generated
by one vendor to run on another vendor's ORB. 
Stubs and other code, generated either from IDL or 
interfaces written in the Java programming language, 
can call into these ORB APIs.



<p>
<a id="unimpl"></a>
<hr>
<h1>CORBA Features Throwing NO_IMPLEMENT() Exceptions</h1>
<hr>
Some methods throw NO_IMPLEMENT() exceptions by default, but ORB vendors
can override them to provide real implementations.  The ORB included in
Sun's release of the Java[tm] Platform, Standard Edition 6, includes 
implementations for the following methods.

<h2>List of Unimplemented Features in Package
<code>org.omg.CORBA.portable</code></h2>

<h3>Unimplemented Interfaces in package <code>org.omg.CORBA.portable</code></h3>
  <ul>
    <li><code>InvokeHandler</code>
    <li><code>ResponseHandler</code>
  </ul>

<h3>Unimplemented Methods in package <code>org.omg.CORBA.portable</code></h3>
<ul>
<li><code>InputStream</code>
  <ul>
    <li><code>public int read()</code>
    <li><code>public.math.BigDecimal read_fixed()</code>
    <li><code>public org.omg.CORBA.Context read_Context()</code>
    <li><code>public  org.omg.CORBA.Object read_Object(java.lang.Class clz)</code>
    <li><code>public org.omg.CORBA.ORB orb()</code>
  </ul>
<li><code>OutputStream</code>
  <ul>
    <li><code>public org.omg.CORBA.ORB orb()</code>
    <li><code>public void write_Context(org.omg.CORBA.Context ctx,
        org.omg.CORBA.ContextList contexts)</code>
    <li><code>public void write_fixed(java.math.BigDecimal value)</code>
    <li><code>public void write(int b)</code>
  </ul>
<li><code>Delegate</code>
  <ul>
    <li><code>public void releaseReply(org.omg.CORBA.Object self, InputStream input)</code>
    <li><code>public InputStream invoke(org.omgl.CORBA.Object self, OutputStream output)</code>
    <li><code>public OutputStream request(org.omg.CORBA.Object self, String operation,
        boolean responseExpected)</code>
    <li><code>public org.omg.CORBA.Object set_policy_override(org.omg.CORBA.Object self,
                                        org.omg.CORBA.Policy[] policies,
                                        org.omg.CORBA.SetOverrideType set_add)</code>
    <li><code>public org.omg.CORBA.DomainManager[] get_domain_managers(
                                                org.omg.CORBA.Objectself)</code>
    <li><code>public org.omg.CORBA.Policy get_policy(org.omg.CORBA.Object self,
                                         int policy_type)</code>
  </ul>
</ul>

@since JDK1.2
@serial exclude
</body>
</html>
