/* * @(#)GIOPVersion.java 1.16 04/06/21 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.corba.se.spi.ior.iiop ; import com.sun.corba.se.spi.ior.IOR ; import com.sun.corba.se.spi.ior.iiop.IIOPProfile; import com.sun.corba.se.spi.orb.ORB; import com.sun.corba.se.spi.orb.ORBVersion; import com.sun.corba.se.spi.orb.ORBVersionFactory; import com.sun.corba.se.impl.orbutil.ORBUtility; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; public class GIOPVersion { // Static fields public static final GIOPVersion V1_0 = new GIOPVersion((byte)1, (byte)0); public static final GIOPVersion V1_1 = new GIOPVersion((byte)1, (byte)1); public static final GIOPVersion V1_2 = new GIOPVersion((byte)1, (byte)2); public static final GIOPVersion V1_3 = new GIOPVersion((byte)1, (byte)3); // Major version 13 indicates Java serialization, // Minor version [00-FF] is the version number. public static final GIOPVersion V13_XX = new GIOPVersion((byte)13, (byte)Message.JAVA_ENC_VERSION); public static final GIOPVersion DEFAULT_VERSION = V1_2; public static final int VERSION_1_0 = 0x0100; public static final int VERSION_1_1 = 0x0101; public static final int VERSION_1_2 = 0x0102; public static final int VERSION_1_3 = 0x0103; public static final int VERSION_13_XX = ((0x0D << 8) & 0x0000FF00) | Message.JAVA_ENC_VERSION; // Instance variables private byte major = (byte) 0; private byte minor = (byte) 0; // Constructor public GIOPVersion() {} public GIOPVersion(byte majorB, byte minorB) { this.major = majorB; this.minor = minorB; } public GIOPVersion(int major, int minor) { this.major = (byte)major; this.minor = (byte)minor; } // Accessor methods public byte getMajor() { return this.major; } public byte getMinor() { return this.minor; } // General methods public boolean equals(GIOPVersion gv){ return gv.major == this.major && gv.minor == this.minor ; } public boolean equals(Object obj) { if (obj != null && (obj instanceof GIOPVersion)) return equals((GIOPVersion)obj); else return false; } public int hashCode() { return 37*major + minor ; } public boolean lessThan(GIOPVersion gv) { if (this.major < gv.major) { return true; } else if (this.major == gv.major) { if (this.minor < gv.minor) { return true; } } return false; } public int intValue() { return (major << 8 | minor); } public String toString() { return major + "." + minor; } public static GIOPVersion getInstance(byte major, byte minor) { switch(((major << 8) | minor)) { case VERSION_1_0: return GIOPVersion.V1_0; case VERSION_1_1: return GIOPVersion.V1_1; case VERSION_1_2: return GIOPVersion.V1_2; case VERSION_1_3: return GIOPVersion.V1_3; case VERSION_13_XX: return GIOPVersion.V13_XX; default: return new GIOPVersion(major, minor); } } public static GIOPVersion parseVersion(String s) { int dotIdx = s.indexOf('.'); if (dotIdx < 1 || dotIdx == s.length() - 1) throw new NumberFormatException("GIOP major, minor, and decimal point required: " + s); int major = Integer.parseInt(s.substring(0, dotIdx)); int minor = Integer.parseInt(s.substring(dotIdx + 1, s.length())); return GIOPVersion.getInstance((byte)major, (byte)minor); } /** * This chooses the appropriate GIOP version. * * @return the GIOP version 13.00 if Java serialization is enabled, or * smallest(profGIOPVersion, orbGIOPVersion) */ public static GIOPVersion chooseRequestVersion(ORB orb, IOR ior ) { GIOPVersion orbVersion = orb.getORBData().getGIOPVersion(); IIOPProfile prof = ior.getProfile() ; GIOPVersion profVersion = prof.getGIOPVersion(); // Check if the profile is from a legacy Sun ORB. ORBVersion targetOrbVersion = prof.getORBVersion(); if (!(targetOrbVersion.equals(ORBVersionFactory.getFOREIGN())) && targetOrbVersion.lessThan(ORBVersionFactory.getNEWER())) { // we are dealing with a SUN legacy orb which emits 1.1 IORs, // in spite of being able to handle only GIOP 1.0 messages. return V1_0; } // Now the target has to be (FOREIGN | NEWER*) byte prof_major = profVersion.getMajor(); byte prof_minor = profVersion.getMinor(); byte orb_major = orbVersion.getMajor(); byte orb_minor = orbVersion.getMinor(); if (orb_major < prof_major) { return orbVersion; } else if (orb_major > prof_major) { return profVersion; } else { // both major version are the same if (orb_minor <= prof_minor) { return orbVersion; } else { return profVersion; } } } public boolean supportsIORIIOPProfileComponents() { return getMinor() > 0 || getMajor() > 1; } // IO methods public void read(org.omg.CORBA.portable.InputStream istream) { this.major = istream.read_octet(); this.minor = istream.read_octet(); } public void write(org.omg.CORBA.portable.OutputStream ostream) { ostream.write_octet(this.major); ostream.write_octet(this.minor); } }