Thu, 24 May 2018 16:41:12 +0800
Merge
1 /*
2 * Copyright (c) 2000, 2016, 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 */
26 package com.sun.corba.se.impl.orbutil;
28 import java.lang.Character;
29 import java.lang.reflect.Field;
30 import java.lang.reflect.Method;
31 import java.rmi.NoSuchObjectException;
32 import java.security.AccessController;
33 import java.security.PermissionCollection;
34 import java.security.Policy;
35 import java.security.PrivilegedAction;
36 import java.security.ProtectionDomain;
37 import java.security.PrivilegedActionException;
38 import java.security.PrivilegedExceptionAction;
39 import java.util.HashMap;
40 import java.util.HashSet;
41 import java.util.Hashtable;
42 import java.util.Iterator;
43 import java.util.Enumeration;
44 import java.util.StringTokenizer;
45 import java.util.NoSuchElementException;
47 import javax.rmi.CORBA.ValueHandler;
48 import javax.rmi.CORBA.ValueHandlerMultiFormat;
49 import javax.rmi.CORBA.Util;
51 import org.omg.CORBA.StructMember ;
52 import org.omg.CORBA.TypeCode ;
53 import org.omg.CORBA.Any ;
54 import org.omg.CORBA.TCKind ;
55 import org.omg.CORBA.SystemException ;
56 import org.omg.CORBA.CompletionStatus ;
57 import org.omg.CORBA.DATA_CONVERSION ;
58 import org.omg.CORBA.BAD_PARAM ;
59 import org.omg.CORBA.BAD_OPERATION ;
60 import org.omg.CORBA.INTERNAL ;
61 import org.omg.CORBA.TypeCodePackage.BadKind ;
62 import org.omg.CORBA.portable.OutputStream ;
63 import org.omg.CORBA.portable.InputStream ;
65 import com.sun.corba.se.pept.transport.ContactInfoList ;
67 import com.sun.corba.se.spi.ior.IOR ;
68 import com.sun.corba.se.spi.presentation.rmi.StubAdapter ;
69 import com.sun.corba.se.spi.orb.ORB ;
70 import com.sun.corba.se.spi.orb.ORBVersion ;
71 import com.sun.corba.se.spi.orb.ORBVersionFactory ;
72 import com.sun.corba.se.spi.protocol.CorbaClientDelegate ;
73 import com.sun.corba.se.spi.protocol.CorbaMessageMediator;
74 import com.sun.corba.se.spi.transport.CorbaContactInfoList ;
75 import com.sun.corba.se.spi.logging.CORBALogDomains ;
76 import com.sun.corba.se.spi.ior.iiop.IIOPProfile;
77 import com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate;
79 import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;
80 import com.sun.corba.se.impl.corba.CORBAObjectImpl ;
81 import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
82 import com.sun.corba.se.impl.logging.OMGSystemException ;
83 import com.sun.corba.se.impl.ior.iiop.JavaSerializationComponent;
85 import sun.corba.SharedSecrets;
87 /**
88 * Handy class full of static functions that don't belong in util.Utility for pure ORB reasons.
89 */
90 public final class ORBUtility {
91 private ORBUtility() {}
93 private static ORBUtilSystemException wrapper = ORBUtilSystemException.get(
94 CORBALogDomains.UTIL ) ;
95 private static OMGSystemException omgWrapper = OMGSystemException.get(
96 CORBALogDomains.UTIL ) ;
98 private static StructMember[] members = null;
100 private static StructMember[] systemExceptionMembers (ORB orb) {
101 if (members == null) {
102 members = new StructMember[3];
103 members[0] = new StructMember("id", orb.create_string_tc(0), null);
104 members[1] = new StructMember("minor", orb.get_primitive_tc(TCKind.tk_long), null);
105 members[2] = new StructMember("completed", orb.get_primitive_tc(TCKind.tk_long), null);
106 }
107 return members;
108 }
110 private static TypeCode getSystemExceptionTypeCode(ORB orb, String repID, String name) {
111 synchronized (TypeCode.class) {
112 return orb.create_exception_tc(repID, name, systemExceptionMembers(orb));
113 }
114 }
116 private static boolean isSystemExceptionTypeCode(TypeCode type, ORB orb) {
117 StructMember[] systemExceptionMembers = systemExceptionMembers(orb);
118 try {
119 return (type.kind().value() == TCKind._tk_except &&
120 type.member_count() == 3 &&
121 type.member_type(0).equal(systemExceptionMembers[0].type) &&
122 type.member_type(1).equal(systemExceptionMembers[1].type) &&
123 type.member_type(2).equal(systemExceptionMembers[2].type));
124 } catch (BadKind ex) {
125 return false;
126 } catch (org.omg.CORBA.TypeCodePackage.Bounds ex) {
127 return false;
128 }
129 }
131 /**
132 * Static method for writing a CORBA standard exception to an Any.
133 * @param any The Any to write the SystemException into.
134 */
135 public static void insertSystemException(SystemException ex, Any any) {
136 OutputStream out = any.create_output_stream();
137 ORB orb = (ORB)(out.orb());
138 String name = ex.getClass().getName();
139 String repID = ORBUtility.repositoryIdOf(name);
140 out.write_string(repID);
141 out.write_long(ex.minor);
142 out.write_long(ex.completed.value());
143 any.read_value(out.create_input_stream(),
144 getSystemExceptionTypeCode(orb, repID, name));
145 }
147 public static SystemException extractSystemException(Any any) {
148 InputStream in = any.create_input_stream();
149 ORB orb = (ORB)(in.orb());
150 if ( ! isSystemExceptionTypeCode(any.type(), orb)) {
151 throw wrapper.unknownDsiSysex(CompletionStatus.COMPLETED_MAYBE);
152 }
153 return ORBUtility.readSystemException(in);
154 }
156 /**
157 * Return default ValueHandler
158 */
159 public static ValueHandler createValueHandler() {
160 ValueHandler vh;
161 try {
162 vh = AccessController.doPrivileged(new PrivilegedExceptionAction<ValueHandler>() {
163 public ValueHandler run() throws Exception {
164 return Util.createValueHandler();
165 }
166 });
167 } catch (PrivilegedActionException e) {
168 throw new InternalError(e.getMessage());
169 }
170 return vh;
171 }
173 /**
174 * Returns true if it was accurately determined that the remote ORB is
175 * a foreign (non-JavaSoft) ORB. Note: If passed the ORBSingleton, this
176 * will return false.
177 */
178 public static boolean isForeignORB(ORB orb)
179 {
180 if (orb == null)
181 return false;
183 try {
184 return orb.getORBVersion().equals(ORBVersionFactory.getFOREIGN());
185 } catch (SecurityException se) {
186 return false;
187 }
188 }
190 /** Unmarshal a byte array to an integer.
191 Assume the bytes are in BIGENDIAN order.
192 i.e. array[offset] is the most-significant-byte
193 and array[offset+3] is the least-significant-byte.
194 @param array The array of bytes.
195 @param offset The offset from which to start unmarshalling.
196 */
197 public static int bytesToInt(byte[] array, int offset)
198 {
199 int b1, b2, b3, b4;
201 b1 = (array[offset++] << 24) & 0xFF000000;
202 b2 = (array[offset++] << 16) & 0x00FF0000;
203 b3 = (array[offset++] << 8) & 0x0000FF00;
204 b4 = (array[offset++] << 0) & 0x000000FF;
206 return (b1 | b2 | b3 | b4);
207 }
209 /** Marshal an integer to a byte array.
210 The bytes are in BIGENDIAN order.
211 i.e. array[offset] is the most-significant-byte
212 and array[offset+3] is the least-significant-byte.
213 @param array The array of bytes.
214 @param offset The offset from which to start marshalling.
215 */
216 public static void intToBytes(int value, byte[] array, int offset)
217 {
218 array[offset++] = (byte)((value >>> 24) & 0xFF);
219 array[offset++] = (byte)((value >>> 16) & 0xFF);
220 array[offset++] = (byte)((value >>> 8) & 0xFF);
221 array[offset++] = (byte)((value >>> 0) & 0xFF);
222 }
224 /** Converts an Ascii Character into Hexadecimal digit
225 */
226 public static int hexOf( char x )
227 {
228 int val;
230 val = x - '0';
231 if (val >=0 && val <= 9)
232 return val;
234 val = (x - 'a') + 10;
235 if (val >= 10 && val <= 15)
236 return val;
238 val = (x - 'A') + 10;
239 if (val >= 10 && val <= 15)
240 return val;
242 throw wrapper.badHexDigit() ;
243 }
245 // method moved from util.Utility
247 /**
248 * Static method for writing a CORBA standard exception to a stream.
249 * @param strm The OutputStream to use for marshaling.
250 */
251 public static void writeSystemException(SystemException ex, OutputStream strm)
252 {
253 String s;
255 s = repositoryIdOf(ex.getClass().getName());
256 strm.write_string(s);
257 strm.write_long(ex.minor);
258 strm.write_long(ex.completed.value());
259 }
261 /**
262 * Static method for reading a CORBA standard exception from a stream.
263 * @param strm The InputStream to use for unmarshaling.
264 */
265 public static SystemException readSystemException(InputStream strm)
266 {
267 try {
268 String name = classNameOf(strm.read_string());
269 SystemException ex = (SystemException)SharedSecrets.
270 getJavaCorbaAccess().loadClass(name).newInstance();
271 ex.minor = strm.read_long();
272 ex.completed = CompletionStatus.from_int(strm.read_long());
273 return ex;
274 } catch ( Exception ex ) {
275 throw wrapper.unknownSysex( CompletionStatus.COMPLETED_MAYBE, ex );
276 }
277 }
279 /**
280 * Get the class name corresponding to a particular repository Id.
281 * This is used by the system to unmarshal (instantiate) the
282 * appropriate exception class for an marshaled as the value of
283 * its repository Id.
284 * @param repositoryId The repository Id for which we want a class name.
285 */
286 public static String classNameOf(String repositoryId)
287 {
288 String className=null;
290 className = (String) exceptionClassNames.get(repositoryId);
291 if (className == null)
292 className = "org.omg.CORBA.UNKNOWN";
294 return className;
295 }
297 /**
298 * Return true if this repositoryId is a SystemException.
299 * @param repositoryId The repository Id to check.
300 */
301 public static boolean isSystemException(String repositoryId)
302 {
303 String className=null;
305 className = (String) exceptionClassNames.get(repositoryId);
306 if (className == null)
307 return false;
308 else
309 return true;
310 }
312 /**
313 * @return the Java serialization encoding version.
314 */
315 public static byte getEncodingVersion(ORB orb, IOR ior) {
317 // Is Java serialization enabled?
318 // Check the JavaSerializationComponent (tagged component)
319 // in the IIOPProfile. If present, the peer ORB's GIOP is capable
320 // of using Java serialization instead of CDR serialization.
321 // In such a case, use Java serialization, iff the java serialization
322 // versions match.
324 if (orb.getORBData().isJavaSerializationEnabled()) {
325 IIOPProfile prof = ior.getProfile();
326 IIOPProfileTemplate profTemp =
327 (IIOPProfileTemplate) prof.getTaggedProfileTemplate();
328 java.util.Iterator iter = profTemp.iteratorById(
329 ORBConstants.TAG_JAVA_SERIALIZATION_ID);
330 if (iter.hasNext()) {
331 JavaSerializationComponent jc =
332 (JavaSerializationComponent) iter.next();
333 byte jcVersion = jc.javaSerializationVersion();
334 if (jcVersion >= Message.JAVA_ENC_VERSION) {
335 return Message.JAVA_ENC_VERSION;
336 } else if (jcVersion > Message.CDR_ENC_VERSION) {
337 return jc.javaSerializationVersion();
338 } else {
339 // throw error?
340 // Since encodingVersion is <= 0 (CDR_ENC_VERSION).
341 }
342 }
343 }
344 return Message.CDR_ENC_VERSION; // default
345 }
347 /**
348 * Get the repository id corresponding to a particular class.
349 * This is used by the system to write the
350 * appropriate repository id for a system exception.
351 * @param name The class name of the system exception.
352 */
353 public static String repositoryIdOf(String name)
354 {
355 String id;
357 id = (String) exceptionRepositoryIds.get(name);
358 if (id == null)
359 id = "IDL:omg.org/CORBA/UNKNOWN:1.0";
361 return id;
362 }
364 private static final Hashtable exceptionClassNames = new Hashtable();
365 private static final Hashtable exceptionRepositoryIds = new Hashtable();
367 static {
369 //
370 // construct repositoryId -> className hashtable
371 //
372 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_CONTEXT:1.0",
373 "org.omg.CORBA.BAD_CONTEXT");
374 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_INV_ORDER:1.0",
375 "org.omg.CORBA.BAD_INV_ORDER");
376 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_OPERATION:1.0",
377 "org.omg.CORBA.BAD_OPERATION");
378 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_PARAM:1.0",
379 "org.omg.CORBA.BAD_PARAM");
380 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_TYPECODE:1.0",
381 "org.omg.CORBA.BAD_TYPECODE");
382 exceptionClassNames.put("IDL:omg.org/CORBA/COMM_FAILURE:1.0",
383 "org.omg.CORBA.COMM_FAILURE");
384 exceptionClassNames.put("IDL:omg.org/CORBA/DATA_CONVERSION:1.0",
385 "org.omg.CORBA.DATA_CONVERSION");
386 exceptionClassNames.put("IDL:omg.org/CORBA/IMP_LIMIT:1.0",
387 "org.omg.CORBA.IMP_LIMIT");
388 exceptionClassNames.put("IDL:omg.org/CORBA/INTF_REPOS:1.0",
389 "org.omg.CORBA.INTF_REPOS");
390 exceptionClassNames.put("IDL:omg.org/CORBA/INTERNAL:1.0",
391 "org.omg.CORBA.INTERNAL");
392 exceptionClassNames.put("IDL:omg.org/CORBA/INV_FLAG:1.0",
393 "org.omg.CORBA.INV_FLAG");
394 exceptionClassNames.put("IDL:omg.org/CORBA/INV_IDENT:1.0",
395 "org.omg.CORBA.INV_IDENT");
396 exceptionClassNames.put("IDL:omg.org/CORBA/INV_OBJREF:1.0",
397 "org.omg.CORBA.INV_OBJREF");
398 exceptionClassNames.put("IDL:omg.org/CORBA/MARSHAL:1.0",
399 "org.omg.CORBA.MARSHAL");
400 exceptionClassNames.put("IDL:omg.org/CORBA/NO_MEMORY:1.0",
401 "org.omg.CORBA.NO_MEMORY");
402 exceptionClassNames.put("IDL:omg.org/CORBA/FREE_MEM:1.0",
403 "org.omg.CORBA.FREE_MEM");
404 exceptionClassNames.put("IDL:omg.org/CORBA/NO_IMPLEMENT:1.0",
405 "org.omg.CORBA.NO_IMPLEMENT");
406 exceptionClassNames.put("IDL:omg.org/CORBA/NO_PERMISSION:1.0",
407 "org.omg.CORBA.NO_PERMISSION");
408 exceptionClassNames.put("IDL:omg.org/CORBA/NO_RESOURCES:1.0",
409 "org.omg.CORBA.NO_RESOURCES");
410 exceptionClassNames.put("IDL:omg.org/CORBA/NO_RESPONSE:1.0",
411 "org.omg.CORBA.NO_RESPONSE");
412 exceptionClassNames.put("IDL:omg.org/CORBA/OBJ_ADAPTER:1.0",
413 "org.omg.CORBA.OBJ_ADAPTER");
414 exceptionClassNames.put("IDL:omg.org/CORBA/INITIALIZE:1.0",
415 "org.omg.CORBA.INITIALIZE");
416 exceptionClassNames.put("IDL:omg.org/CORBA/PERSIST_STORE:1.0",
417 "org.omg.CORBA.PERSIST_STORE");
418 exceptionClassNames.put("IDL:omg.org/CORBA/TRANSIENT:1.0",
419 "org.omg.CORBA.TRANSIENT");
420 exceptionClassNames.put("IDL:omg.org/CORBA/UNKNOWN:1.0",
421 "org.omg.CORBA.UNKNOWN");
422 exceptionClassNames.put("IDL:omg.org/CORBA/OBJECT_NOT_EXIST:1.0",
423 "org.omg.CORBA.OBJECT_NOT_EXIST");
425 // SystemExceptions from OMG Transactions Service Spec
426 exceptionClassNames.put("IDL:omg.org/CORBA/INVALID_TRANSACTION:1.0",
427 "org.omg.CORBA.INVALID_TRANSACTION");
428 exceptionClassNames.put("IDL:omg.org/CORBA/TRANSACTION_REQUIRED:1.0",
429 "org.omg.CORBA.TRANSACTION_REQUIRED");
430 exceptionClassNames.put("IDL:omg.org/CORBA/TRANSACTION_ROLLEDBACK:1.0",
431 "org.omg.CORBA.TRANSACTION_ROLLEDBACK");
433 // from portability RTF 98-07-01.txt
434 exceptionClassNames.put("IDL:omg.org/CORBA/INV_POLICY:1.0",
435 "org.omg.CORBA.INV_POLICY");
437 // from orbrev/00-09-01 (CORBA 2.4 Draft Specification)
438 exceptionClassNames.
439 put("IDL:omg.org/CORBA/TRANSACTION_UNAVAILABLE:1.0",
440 "org.omg.CORBA.TRANSACTION_UNAVAILABLE");
441 exceptionClassNames.put("IDL:omg.org/CORBA/TRANSACTION_MODE:1.0",
442 "org.omg.CORBA.TRANSACTION_MODE");
444 // Exception types introduced between CORBA 2.4 and 3.0
445 exceptionClassNames.put("IDL:omg.org/CORBA/CODESET_INCOMPATIBLE:1.0",
446 "org.omg.CORBA.CODESET_INCOMPATIBLE");
447 exceptionClassNames.put("IDL:omg.org/CORBA/REBIND:1.0",
448 "org.omg.CORBA.REBIND");
449 exceptionClassNames.put("IDL:omg.org/CORBA/TIMEOUT:1.0",
450 "org.omg.CORBA.TIMEOUT");
451 exceptionClassNames.put("IDL:omg.org/CORBA/BAD_QOS:1.0",
452 "org.omg.CORBA.BAD_QOS");
454 // Exception types introduced in CORBA 3.0
455 exceptionClassNames.put("IDL:omg.org/CORBA/INVALID_ACTIVITY:1.0",
456 "org.omg.CORBA.INVALID_ACTIVITY");
457 exceptionClassNames.put("IDL:omg.org/CORBA/ACTIVITY_COMPLETED:1.0",
458 "org.omg.CORBA.ACTIVITY_COMPLETED");
459 exceptionClassNames.put("IDL:omg.org/CORBA/ACTIVITY_REQUIRED:1.0",
460 "org.omg.CORBA.ACTIVITY_REQUIRED");
462 //
463 // construct className -> repositoryId hashtable
464 //
465 Enumeration keys = exceptionClassNames.keys();
466 java.lang.Object s;
467 String rId;
468 String cName;
470 try{
471 while (keys.hasMoreElements()) {
472 s = keys.nextElement();
473 rId = (String) s;
474 cName = (String) exceptionClassNames.get(rId);
475 exceptionRepositoryIds.put (cName, rId);
476 }
477 } catch (NoSuchElementException e) { }
478 }
480 /** Parse a version string such as "1.1.6" or "jdk1.2fcs" into
481 a version array of integers {1, 1, 6} or {1, 2}.
482 A string of "n." or "n..m" is equivalent to "n.0" or "n.0.m" respectively.
483 */
484 public static int[] parseVersion(String version) {
485 if (version == null)
486 return new int[0];
487 char[] s = version.toCharArray();
488 //find the maximum span of the string "n.n.n..." where n is an integer
489 int start = 0;
490 for (; start < s.length && (s[start] < '0' || s[start] > '9'); ++start)
491 if (start == s.length) //no digit found
492 return new int[0];
493 int end = start + 1;
494 int size = 1;
495 for (; end < s.length; ++end)
496 if (s[end] == '.')
497 ++size;
498 else if (s[end] < '0' || s[end] > '9')
499 break;
500 int[] val = new int[size];
501 for (int i = 0; i < size; ++i) {
502 int dot = version.indexOf('.', start);
503 if (dot == -1 || dot > end)
504 dot = end;
505 if (start >= dot) //cases like "n." or "n..m"
506 val[i] = 0; //convert equivalent to "n.0" or "n.0.m"
507 else
508 val[i] = Integer.parseInt(version.substring(start, dot));
509 start = dot + 1;
510 }
511 return val;
512 }
514 /** Compare two version arrays.
515 Return 1, 0 or -1 if v1 is greater than, equal to, or less than v2.
516 */
517 public static int compareVersion(int[] v1, int[] v2) {
518 if (v1 == null)
519 v1 = new int[0];
520 if (v2 == null)
521 v2 = new int[0];
522 for (int i = 0; i < v1.length; ++i) {
523 if (i >= v2.length || v1[i] > v2[i]) //v1 is longer or greater than v2
524 return 1;
525 if (v1[i] < v2[i])
526 return -1;
527 }
528 return v1.length == v2.length ? 0 : -1;
529 }
531 /** Compare two version strings.
532 Return 1, 0 or -1 if v1 is greater than, equal to, or less than v2.
533 */
534 public static synchronized int compareVersion(String v1, String v2) {
535 return compareVersion(parseVersion(v1), parseVersion(v2));
536 }
538 private static String compressClassName( String name )
539 {
540 // Note that this must end in . in order to be renamed correctly.
541 String prefix = "com.sun.corba.se." ;
542 if (name.startsWith( prefix ) ) {
543 return "(ORB)." + name.substring( prefix.length() ) ;
544 } else
545 return name ;
546 }
548 // Return a compressed representation of the thread name. This is particularly
549 // useful on the server side, where there are many SelectReaderThreads, and
550 // we need a short unambiguous name for such threads.
551 public static String getThreadName( Thread thr )
552 {
553 if (thr == null)
554 return "null" ;
556 // This depends on the formatting in SelectReaderThread and CorbaConnectionImpl.
557 // Pattern for SelectReaderThreads:
558 // SelectReaderThread CorbaConnectionImpl[ <host> <post> <state>]
559 // Any other pattern in the Thread's name is just returned.
560 String name = thr.getName() ;
561 StringTokenizer st = new StringTokenizer( name ) ;
562 int numTokens = st.countTokens() ;
563 if (numTokens != 5)
564 return name ;
566 String[] tokens = new String[numTokens] ;
567 for (int ctr=0; ctr<numTokens; ctr++ )
568 tokens[ctr] = st.nextToken() ;
570 if( !tokens[0].equals("SelectReaderThread"))
571 return name ;
573 return "SelectReaderThread[" + tokens[2] + ":" + tokens[3] + "]" ;
574 }
576 private static String formatStackTraceElement( StackTraceElement ste )
577 {
578 return compressClassName( ste.getClassName() ) + "." + ste.getMethodName() +
579 (ste.isNativeMethod() ? "(Native Method)" :
580 (ste.getFileName() != null && ste.getLineNumber() >= 0 ?
581 "(" + ste.getFileName() + ":" + ste.getLineNumber() + ")" :
582 (ste.getFileName() != null ? "("+ste.getFileName()+")" : "(Unknown Source)")));
583 }
585 private static void printStackTrace( StackTraceElement[] trace )
586 {
587 System.out.println( " Stack Trace:" ) ;
588 // print the stack trace, ommitting the zeroth element, which is
589 // always this method.
590 for ( int ctr = 1; ctr < trace.length; ctr++ ) {
591 System.out.print( " >" ) ;
592 System.out.println( formatStackTraceElement( trace[ctr] ) ) ;
593 }
594 }
596 //
597 // Implements all dprint calls in this package.
598 //
599 public static synchronized void dprint(java.lang.Object obj, String msg) {
600 System.out.println(
601 compressClassName( obj.getClass().getName() ) + "(" +
602 getThreadName( Thread.currentThread() ) + "): " + msg);
603 }
605 public static synchronized void dprint(String className, String msg) {
606 System.out.println(
607 compressClassName( className ) + "(" +
608 getThreadName( Thread.currentThread() ) + "): " + msg);
609 }
611 public synchronized void dprint(String msg) {
612 ORBUtility.dprint(this, msg);
613 }
615 public static synchronized void dprintTrace(Object obj, String msg) {
616 ORBUtility.dprint(obj, msg);
618 Throwable thr = new Throwable() ;
619 printStackTrace( thr.getStackTrace() ) ;
620 }
622 public static synchronized void dprint(java.lang.Object caller,
623 String msg, Throwable t)
624 {
625 System.out.println(
626 compressClassName( caller.getClass().getName() ) +
627 '(' + Thread.currentThread() + "): " + msg);
629 if (t != null)
630 printStackTrace( t.getStackTrace() ) ;
631 }
633 public static String[] concatenateStringArrays( String[] arr1, String[] arr2 )
634 {
635 String[] result = new String[
636 arr1.length + arr2.length ] ;
638 for (int ctr = 0; ctr<arr1.length; ctr++)
639 result[ctr] = arr1[ctr] ;
641 for (int ctr = 0; ctr<arr2.length; ctr++)
642 result[ctr + arr1.length] = arr2[ctr] ;
644 return result ;
645 }
647 /**
648 * Throws the CORBA equivalent of a java.io.NotSerializableException
649 *
650 * Duplicated from util/Utility for Pure ORB reasons. There are two
651 * reasons for this:
652 *
653 * 1) We can't introduce dependencies on the util version from outside
654 * of the io/util packages since it will not exist in the pure ORB
655 * build running on JDK 1.3.x.
656 *
657 * 2) We need to pick up the correct minor code from OMGSystemException.
658 */
659 public static void throwNotSerializableForCorba(String className) {
660 throw omgWrapper.notSerializable( CompletionStatus.COMPLETED_MAYBE,
661 className ) ;
662 }
664 /**
665 * Returns the maximum stream format version supported by our
666 * ValueHandler.
667 */
668 public static byte getMaxStreamFormatVersion() {
669 ValueHandler vh;
670 try {
671 vh = AccessController.doPrivileged(new PrivilegedExceptionAction<ValueHandler>() {
672 public ValueHandler run() throws Exception {
673 return Util.createValueHandler();
674 }
675 });
676 } catch (PrivilegedActionException e) {
677 throw new InternalError(e.getMessage());
678 }
680 if (!(vh instanceof javax.rmi.CORBA.ValueHandlerMultiFormat))
681 return ORBConstants.STREAM_FORMAT_VERSION_1;
682 else
683 return ((ValueHandlerMultiFormat)vh).getMaximumStreamFormatVersion();
684 }
686 public static CorbaClientDelegate makeClientDelegate( IOR ior )
687 {
688 ORB orb = ior.getORB() ;
689 CorbaContactInfoList ccil = orb.getCorbaContactInfoListFactory().create( ior ) ;
690 CorbaClientDelegate del = orb.getClientDelegateFactory().create(ccil);
691 return del ;
692 }
694 /** This method is used to create untyped object references.
695 */
696 public static org.omg.CORBA.Object makeObjectReference( IOR ior )
697 {
698 CorbaClientDelegate del = makeClientDelegate( ior ) ;
699 org.omg.CORBA.Object objectImpl = new CORBAObjectImpl() ;
700 StubAdapter.setDelegate( objectImpl, del ) ;
701 return objectImpl ;
702 }
704 /** This method obtains an IOR from a CORBA object reference.
705 * It will return null if obj is a local object, a null object,
706 * or an object implemented by a different ORB. It will
707 * throw BAD_OPERATION if obj is an unconnected RMI-IIOP object.
708 * @return IOR the IOR that represents this objref. This will
709 * never be null.
710 * @exception BAD_OPERATION (from oi._get_delegate) if obj is a
711 * normal objref, but does not have a delegate set.
712 * @exception BAD_PARAM if obj is a local object, or else was
713 * created by a foreign ORB.
714 */
715 public static IOR getIOR( org.omg.CORBA.Object obj )
716 {
717 if (obj == null)
718 throw wrapper.nullObjectReference() ;
720 IOR ior = null ;
721 if (StubAdapter.isStub(obj)) {
722 org.omg.CORBA.portable.Delegate del = StubAdapter.getDelegate(
723 obj ) ;
725 if (del instanceof CorbaClientDelegate) {
726 CorbaClientDelegate cdel = (CorbaClientDelegate)del ;
727 ContactInfoList cil = cdel.getContactInfoList() ;
729 if (cil instanceof CorbaContactInfoList) {
730 CorbaContactInfoList ccil = (CorbaContactInfoList)cil ;
731 ior = ccil.getTargetIOR() ;
732 if (ior == null)
733 throw wrapper.nullIor() ;
735 return ior ;
736 } else {
737 // This is our code, but the ContactInfoList is not a
738 // CorbaContactInfoList. This should not happen, because
739 // we are in the CORBA application of the DCSA framework.
740 // This is a coding error, and thus an INTERNAL exception
741 // should be thrown.
742 // XXX needs minor code
743 throw new INTERNAL() ;
744 }
745 }
747 // obj is implemented by a foreign ORB, because the Delegate is not a
748 // ClientDelegate.
749 // XXX this case could be handled by marshalling and
750 // unmarshalling. However, object_to_string cannot be used
751 // here, as it is implemented with getIOR. Note that this
752 // will require access to an ORB, so that we can create streams
753 // as needed. The ORB is available simply as io._orb().
754 throw wrapper.objrefFromForeignOrb() ;
755 } else
756 throw wrapper.localObjectNotAllowed() ;
757 }
759 /** Obtains an IOR for the object reference obj, first connecting it to
760 * the ORB if necessary.
761 * @return IOR the IOR that represents this objref. This will
762 * never be null.
763 * @exception BAD_OPERATION if the object could not be connected,
764 * if a connection attempt was needed.
765 * @exception BAD_PARAM if obj is a local object, or else was
766 * created by a foreign ORB.
767 */
768 public static IOR connectAndGetIOR( ORB orb, org.omg.CORBA.Object obj )
769 {
770 IOR result ;
771 try {
772 result = getIOR( obj ) ;
773 } catch (BAD_OPERATION bop) {
774 if (StubAdapter.isStub(obj)) {
775 try {
776 StubAdapter.connect( obj, orb ) ;
777 } catch (java.rmi.RemoteException exc) {
778 throw wrapper.connectingServant( exc ) ;
779 }
780 } else {
781 orb.connect( obj ) ;
782 }
784 result = getIOR( obj ) ;
785 }
787 return result ;
788 }
790 public static String operationNameAndRequestId(CorbaMessageMediator m)
791 {
792 return "op/" + m.getOperationName() + " id/" + m.getRequestId();
793 }
795 public static boolean isPrintable(char c)
796 {
797 if (Character.isJavaIdentifierStart(c)) {
798 // Letters and $ _
799 return true;
800 }
801 if (Character.isDigit(c)) {
802 return true;
803 }
804 switch (Character.getType(c)) {
805 case Character.MODIFIER_SYMBOL : return true; // ` ^
806 case Character.DASH_PUNCTUATION : return true; // -
807 case Character.MATH_SYMBOL : return true; // = ~ + | < >
808 case Character.OTHER_PUNCTUATION : return true; // !@#%&*;':",./?
809 case Character.START_PUNCTUATION : return true; // ( [ {
810 case Character.END_PUNCTUATION : return true; // ) ] }
811 }
812 return false;
813 }
815 public static String getClassSecurityInfo(final Class cl)
816 {
817 // Returns a String which looks similar to:
818 // PermissionCollection java.security.Permissions@1053693 ...
819 // (java.io.FilePermission <<ALL FILES>> ....)
820 // (java.io.FilePermission /export0/sunwappserv/lib/- ...)
821 // ... other permissions ...
822 // Domain ProtectionDomain (file:/export0/sunwappserv/lib-)
823 // java.security.Permissions@141fedb (
824 // (java.io.FilePermission <<ALL FILES>> ...)
825 // (java.io.FilePermission /var/tmp//- ...)
827 String result =
828 (String)AccessController.doPrivileged(new PrivilegedAction() {
829 public java.lang.Object run() {
830 StringBuffer sb = new StringBuffer(500);
831 ProtectionDomain pd = cl.getProtectionDomain();
832 Policy policy = Policy.getPolicy();
833 PermissionCollection pc = policy.getPermissions(pd);
834 sb.append("\nPermissionCollection ");
835 sb.append(pc.toString());
836 // Don't need to add 'Protection Domain' string, it's
837 // in ProtectionDomain.toString() already.
838 sb.append(pd.toString());
839 return sb.toString();
840 }
841 });
842 return result;
843 }
844 }
846 // End of file.