1 /*
   2  * Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.corba.se.impl.oa.poa;
  27 
  28 import java.util.*;
  29 import org.omg.CORBA.CompletionStatus;
  30 import org.omg.PortableServer.CurrentPackage.NoContext;
  31 import org.omg.PortableServer.POA;
  32 import org.omg.PortableServer.Servant;
  33 import org.omg.PortableServer.ServantLocatorPackage.CookieHolder;
  34 
  35 import com.sun.corba.se.spi.oa.OAInvocationInfo ;
  36 import com.sun.corba.se.spi.oa.ObjectAdapter ;
  37 
  38 import com.sun.corba.se.spi.orb.ORB ;
  39 
  40 import com.sun.corba.se.spi.logging.CORBALogDomains ;
  41 
  42 import com.sun.corba.se.impl.logging.POASystemException ;
  43 
  44 // XXX Needs to be turned into LocalObjectImpl.
  45 
  46 public class POACurrent extends org.omg.CORBA.portable.ObjectImpl
  47     implements org.omg.PortableServer.Current
  48 {
  49     private ORB orb;
  50     private POASystemException wrapper ;
  51 
  52     public POACurrent(ORB orb)
  53     {
  54         this.orb = orb;
  55         wrapper = POASystemException.get( orb,
  56             CORBALogDomains.OA_INVOCATION ) ;
  57     }
  58 
  59     public String[] _ids()
  60     {
  61         String[] ids = new String[1];
  62         ids[0] = "IDL:omg.org/PortableServer/Current:1.0";
  63         return ids;
  64     }
  65 
  66     //
  67     // Standard OMG operations.
  68     //
  69 
  70     public POA get_POA()
  71         throws
  72             NoContext
  73     {
  74         POA poa = (POA)(peekThrowNoContext().oa());
  75         throwNoContextIfNull(poa);
  76         return poa;
  77     }
  78 
  79     public byte[] get_object_id()
  80         throws
  81             NoContext
  82     {
  83         byte[] objectid = peekThrowNoContext().id();
  84         throwNoContextIfNull(objectid);
  85         return objectid;
  86     }
  87 
  88     //
  89     // Implementation operations used by POA package.
  90     //
  91 
  92     public ObjectAdapter getOA()
  93     {
  94         ObjectAdapter oa = peekThrowInternal().oa();
  95         throwInternalIfNull(oa);
  96         return oa;
  97     }
  98 
  99     public byte[] getObjectId()
 100     {
 101         byte[] objectid = peekThrowInternal().id();
 102         throwInternalIfNull(objectid);
 103         return objectid;
 104     }
 105 
 106     Servant getServant()
 107     {
 108         Servant servant = (Servant)(peekThrowInternal().getServantContainer());
 109         // If is OK for the servant to be null.
 110         // This could happen if POAImpl.getServant is called but
 111         // POAImpl.internalGetServant throws an exception.
 112         return servant;
 113     }
 114 
 115     CookieHolder getCookieHolder()
 116     {
 117         CookieHolder cookieHolder = peekThrowInternal().getCookieHolder();
 118         throwInternalIfNull(cookieHolder);
 119         return cookieHolder;
 120     }
 121 
 122     // This is public so we can test the stack balance.
 123     // It is not a security hole since this same info can be obtained from
 124     // PortableInterceptors.
 125     public String getOperation()
 126     {
 127         String operation = peekThrowInternal().getOperation();
 128         throwInternalIfNull(operation);
 129         return operation;
 130     }
 131 
 132     void setServant(Servant servant)
 133     {
 134         peekThrowInternal().setServant( servant );
 135     }
 136 
 137     //
 138     // Class utilities.
 139     //
 140 
 141     private OAInvocationInfo peekThrowNoContext()
 142         throws
 143             NoContext
 144     {
 145         OAInvocationInfo invocationInfo = null;
 146         try {
 147             invocationInfo = orb.peekInvocationInfo() ;
 148         } catch (EmptyStackException e) {
 149             throw new NoContext();
 150         }
 151         return invocationInfo;
 152     }
 153 
 154     private OAInvocationInfo peekThrowInternal()
 155     {
 156         OAInvocationInfo invocationInfo = null;
 157         try {
 158             invocationInfo = orb.peekInvocationInfo() ;
 159         } catch (EmptyStackException e) {
 160             // The completion status is maybe because this could happen
 161             // after the servant has been invoked.
 162             throw wrapper.poacurrentUnbalancedStack( e ) ;
 163         }
 164         return invocationInfo;
 165     }
 166 
 167     private void throwNoContextIfNull(Object o)
 168         throws
 169             NoContext
 170     {
 171         if ( o == null ) {
 172             throw new NoContext();
 173         }
 174     }
 175 
 176     private void throwInternalIfNull(Object o)
 177     {
 178         if ( o == null ) {
 179             throw wrapper.poacurrentNullField( CompletionStatus.COMPLETED_MAYBE ) ;
 180         }
 181     }
 182 }