IIOPProfileTemplateImpl.java revision 608:7e06bf1dcb09
1327952Sdim/* 2259698Sdim * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 3353358Sdim * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4353358Sdim * 5353358Sdim * This code is free software; you can redistribute it and/or modify it 6259698Sdim * under the terms of the GNU General Public License version 2 only, as 7259698Sdim * published by the Free Software Foundation. Oracle designates this 8259698Sdim * particular file as subject to the "Classpath" exception as provided 9259698Sdim * by Oracle in the LICENSE file that accompanied this code. 10259698Sdim * 11259698Sdim * This code is distributed in the hope that it will be useful, but WITHOUT 12259698Sdim * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13259698Sdim * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14259698Sdim * version 2 for more details (a copy is included in the LICENSE file that 15341825Sdim * accompanied this code). 16259698Sdim * 17327952Sdim * You should have received a copy of the GNU General Public License version 18259698Sdim * 2 along with this work; if not, write to the Free Software Foundation, 19327952Sdim * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20327952Sdim * 21327952Sdim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22327952Sdim * or visit www.oracle.com if you need additional information or have any 23327952Sdim * questions. 24259698Sdim */ 25259698Sdim 26259698Sdimpackage com.sun.corba.se.impl.ior.iiop; 27327952Sdim 28327952Sdimimport java.util.Iterator ; 29259698Sdim 30259698Sdimimport org.omg.IOP.TAG_INTERNET_IOP ; 31276479Sdim 32276479Sdimimport org.omg.CORBA_2_3.portable.InputStream ; 33259698Sdimimport org.omg.CORBA_2_3.portable.OutputStream ; 34327952Sdim 35259698Sdimimport com.sun.corba.se.spi.ior.TaggedComponent ; 36259698Sdimimport com.sun.corba.se.spi.ior.TaggedProfile ; 37327952Sdimimport com.sun.corba.se.spi.ior.TaggedProfileTemplate ; 38341825Sdimimport com.sun.corba.se.spi.ior.TaggedProfileTemplateBase ; 39259698Sdimimport com.sun.corba.se.spi.ior.ObjectKeyTemplate ; 40296417Sdimimport com.sun.corba.se.spi.ior.ObjectId ; 41327952Sdimimport com.sun.corba.se.spi.ior.IdentifiableContainerBase ; 42341825Sdimimport com.sun.corba.se.spi.ior.IdentifiableBase ; 43259698Sdim 44259698Sdimimport com.sun.corba.se.impl.ior.EncapsulationUtility ; 45296417Sdim 46327952Sdimimport com.sun.corba.se.spi.ior.iiop.IIOPProfileTemplate ; 47341825Sdimimport com.sun.corba.se.spi.ior.iiop.IIOPAddress ; 48259698Sdimimport com.sun.corba.se.spi.ior.iiop.IIOPFactories ; 49259698Sdim 50259698Sdimimport com.sun.corba.se.impl.encoding.EncapsOutputStream ; 51259698Sdim 52259698Sdimimport com.sun.corba.se.impl.encoding.CDROutputStream ; 53259698Sdim 54259698Sdimimport com.sun.corba.se.spi.ior.iiop.GIOPVersion ; 55259698Sdimimport com.sun.corba.se.spi.orb.ORB ; 56259698Sdim 57327952Sdim/** 58259698Sdim * @author 59259698Sdim * If getMinorVersion==0, this does not contain any tagged components 60259698Sdim */ 61327952Sdimpublic class IIOPProfileTemplateImpl extends TaggedProfileTemplateBase 62327952Sdim implements IIOPProfileTemplate 63259698Sdim{ 64259698Sdim private ORB orb ; 65259698Sdim private GIOPVersion giopVersion ; 66259698Sdim private IIOPAddress primary ; 67259698Sdim 68259698Sdim public boolean equals( Object obj ) 69259698Sdim { 70360784Sdim if (!(obj instanceof IIOPProfileTemplateImpl)) 71259698Sdim return false ; 72259698Sdim 73259698Sdim IIOPProfileTemplateImpl other = (IIOPProfileTemplateImpl)obj ; 74259698Sdim 75259698Sdim return super.equals( obj ) && giopVersion.equals( other.giopVersion ) && 76259698Sdim primary.equals( other.primary ) ; 77259698Sdim } 78259698Sdim 79259698Sdim public int hashCode() 80259698Sdim { 81259698Sdim return super.hashCode() ^ giopVersion.hashCode() ^ primary.hashCode() ; 82259698Sdim } 83259698Sdim 84259698Sdim public TaggedProfile create( ObjectKeyTemplate oktemp, ObjectId id ) 85259698Sdim { 86259698Sdim return IIOPFactories.makeIIOPProfile( orb, oktemp, id, this ) ; 87259698Sdim } 88259698Sdim 89259698Sdim public GIOPVersion getGIOPVersion() 90259698Sdim { 91259698Sdim return giopVersion ; 92259698Sdim } 93259698Sdim 94259698Sdim public IIOPAddress getPrimaryAddress() 95259698Sdim { 96259698Sdim return primary ; 97259698Sdim } 98259698Sdim 99259698Sdim public IIOPProfileTemplateImpl( ORB orb, GIOPVersion version, IIOPAddress primary ) 100259698Sdim { 101259698Sdim this.orb = orb ; 102259698Sdim this.giopVersion = version ; 103259698Sdim this.primary = primary ; 104259698Sdim if (giopVersion.getMinor() == 0) 105259698Sdim // Adding tagged components is not allowed for IIOP 1.0, 106259698Sdim // so this template is complete and should be made immutable. 107259698Sdim makeImmutable() ; 108259698Sdim } 109259698Sdim 110259698Sdim public IIOPProfileTemplateImpl( InputStream istr ) 111259698Sdim { 112259698Sdim byte major = istr.read_octet() ; 113259698Sdim byte minor = istr.read_octet() ; 114259698Sdim giopVersion = GIOPVersion.getInstance( major, minor ) ; 115259698Sdim primary = new IIOPAddressImpl( istr ) ; 116259698Sdim orb = (ORB)(istr.orb()) ; 117259698Sdim // Handle any tagged components (if applicable) 118259698Sdim if (minor > 0) 119259698Sdim EncapsulationUtility.readIdentifiableSequence( 120259698Sdim this, orb.getTaggedComponentFactoryFinder(), istr ) ; 121259698Sdim 122259698Sdim makeImmutable() ; 123259698Sdim } 124259698Sdim 125259698Sdim public void write( ObjectKeyTemplate okeyTemplate, ObjectId id, OutputStream os) 126259698Sdim { 127259698Sdim giopVersion.write( os ) ; 128259698Sdim primary.write( os ) ; 129259698Sdim 130259698Sdim // Note that this is NOT an encapsulation: do not marshal 131259698Sdim // the endianness flag. However, the length is required. 132259698Sdim // Note that this cannot be accomplished with a codec! 133259698Sdim 134259698Sdim // Use the byte order of the given stream 135259698Sdim OutputStream encapsulatedOS = 136296417Sdim sun.corba.OutputStreamFactory.newEncapsOutputStream( 137259698Sdim (ORB)os.orb(), ((CDROutputStream)os).isLittleEndian() ) ; 138259698Sdim 139259698Sdim okeyTemplate.write( id, encapsulatedOS ) ; 140259698Sdim EncapsulationUtility.writeOutputStream( encapsulatedOS, os ) ; 141276479Sdim 142276479Sdim if (giopVersion.getMinor() > 0) 143276479Sdim EncapsulationUtility.writeIdentifiableSequence( this, os ) ; 144259698Sdim } 145259698Sdim 146259698Sdim /** Write out this IIOPProfileTemplateImpl only. 147259698Sdim */ 148259698Sdim public void writeContents( OutputStream os) 149259698Sdim { 150259698Sdim giopVersion.write( os ) ; 151259698Sdim primary.write( os ) ; 152259698Sdim 153259698Sdim if (giopVersion.getMinor() > 0) 154259698Sdim EncapsulationUtility.writeIdentifiableSequence( this, os ) ; 155259698Sdim } 156259698Sdim 157259698Sdim public int getId() 158259698Sdim { 159259698Sdim return TAG_INTERNET_IOP.value ; 160259698Sdim } 161259698Sdim 162259698Sdim public boolean isEquivalent( TaggedProfileTemplate temp ) 163259698Sdim { 164259698Sdim if (!(temp instanceof IIOPProfileTemplateImpl)) 165259698Sdim return false ; 166259698Sdim 167259698Sdim IIOPProfileTemplateImpl tempimp = (IIOPProfileTemplateImpl)temp ; 168259698Sdim 169259698Sdim return primary.equals( tempimp.primary ) ; 170259698Sdim } 171259698Sdim 172259698Sdim} 173259698Sdim