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