SpecialMethod.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 1998, 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 26package com.sun.corba.se.impl.protocol ; 27 28import javax.rmi.CORBA.Tie; 29 30import org.omg.CORBA.SystemException ; 31import org.omg.CORBA.NO_IMPLEMENT ; 32import org.omg.CORBA.OBJECT_NOT_EXIST ; 33import org.omg.CORBA.CompletionStatus ; 34import org.omg.CORBA.portable.InputStream; 35import org.omg.CORBA.portable.OutputStream; 36 37import com.sun.corba.se.spi.oa.ObjectAdapter; 38import com.sun.corba.se.spi.orb.ORB; 39 40import com.sun.corba.se.spi.protocol.CorbaMessageMediator; 41 42import com.sun.corba.se.spi.logging.CORBALogDomains; 43 44import com.sun.corba.se.impl.logging.ORBUtilSystemException; 45 46import com.sun.corba.se.spi.oa.NullServant ; 47 48public abstract class SpecialMethod { 49 public abstract boolean isNonExistentMethod() ; 50 public abstract String getName(); 51 public abstract CorbaMessageMediator invoke(java.lang.Object servant, 52 CorbaMessageMediator request, 53 byte[] objectId, 54 ObjectAdapter objectAdapter); 55 56 public static final SpecialMethod getSpecialMethod(String operation) { 57 for(int i = 0; i < methods.length; i++) 58 if (methods[i].getName().equals(operation)) 59 return methods[i]; 60 return null; 61 } 62 63 static SpecialMethod[] methods = { 64 new IsA(), 65 new GetInterface(), 66 new NonExistent(), 67 new NotExistent() 68 }; 69} 70 71class NonExistent extends SpecialMethod { 72 public boolean isNonExistentMethod() 73 { 74 return true ; 75 } 76 77 public String getName() { // _non_existent 78 return "_non_existent"; 79 } 80 81 public CorbaMessageMediator invoke(java.lang.Object servant, 82 CorbaMessageMediator request, 83 byte[] objectId, 84 ObjectAdapter objectAdapter) 85 { 86 boolean result = (servant == null) || (servant instanceof NullServant) ; 87 CorbaMessageMediator response = 88 request.getProtocolHandler().createResponse(request, null); 89 ((OutputStream)response.getOutputObject()).write_boolean(result); 90 return response; 91 } 92} 93 94class NotExistent extends NonExistent { 95 public String getName() { // _not_existent 96 return "_not_existent"; 97 } 98} 99 100class IsA extends SpecialMethod { // _is_a 101 public boolean isNonExistentMethod() 102 { 103 return false ; 104 } 105 106 public String getName() { 107 return "_is_a"; 108 } 109 public CorbaMessageMediator invoke(java.lang.Object servant, 110 CorbaMessageMediator request, 111 byte[] objectId, 112 ObjectAdapter objectAdapter) 113 { 114 if ((servant == null) || (servant instanceof NullServant)) { 115 ORB orb = (ORB)request.getBroker() ; 116 ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb, 117 CORBALogDomains.OA_INVOCATION ) ; 118 119 return request.getProtocolHandler().createSystemExceptionResponse( 120 request, wrapper.badSkeleton(), null); 121 } 122 123 String[] ids = objectAdapter.getInterfaces( servant, objectId ); 124 String clientId = 125 ((InputStream)request.getInputObject()).read_string(); 126 boolean answer = false; 127 for(int i = 0; i < ids.length; i++) 128 if (ids[i].equals(clientId)) { 129 answer = true; 130 break; 131 } 132 133 CorbaMessageMediator response = 134 request.getProtocolHandler().createResponse(request, null); 135 ((OutputStream)response.getOutputObject()).write_boolean(answer); 136 return response; 137 } 138} 139 140class GetInterface extends SpecialMethod { // _get_interface 141 public boolean isNonExistentMethod() 142 { 143 return false ; 144 } 145 146 public String getName() { 147 return "_interface"; 148 } 149 public CorbaMessageMediator invoke(java.lang.Object servant, 150 CorbaMessageMediator request, 151 byte[] objectId, 152 ObjectAdapter objectAdapter) 153 { 154 ORB orb = (ORB)request.getBroker() ; 155 ORBUtilSystemException wrapper = ORBUtilSystemException.get( orb, 156 CORBALogDomains.OA_INVOCATION ) ; 157 158 if ((servant == null) || (servant instanceof NullServant)) { 159 return request.getProtocolHandler().createSystemExceptionResponse( 160 request, wrapper.badSkeleton(), null); 161 } else { 162 return request.getProtocolHandler().createSystemExceptionResponse( 163 request, wrapper.getinterfaceNotImplemented(), null); 164 } 165 } 166} 167 168// End of file. 169