ObjectKeyTemplateBase.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 2000, 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.ior;
27
28import java.util.Iterator ;
29
30import org.omg.CORBA_2_3.portable.InputStream ;
31import org.omg.CORBA_2_3.portable.OutputStream ;
32
33import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ;
34
35import com.sun.corba.se.spi.ior.ObjectId ;
36import com.sun.corba.se.spi.ior.ObjectAdapterId ;
37import com.sun.corba.se.spi.ior.ObjectKeyTemplate ;
38
39import com.sun.corba.se.spi.orb.ORB ;
40import com.sun.corba.se.spi.orb.ORBVersion ;
41
42import com.sun.corba.se.spi.logging.CORBALogDomains ;
43
44
45import com.sun.corba.se.impl.encoding.EncapsOutputStream ;
46
47import com.sun.corba.se.impl.logging.IORSystemException ;
48
49
50/**
51 * @author
52 */
53public abstract class ObjectKeyTemplateBase implements ObjectKeyTemplate
54{
55    // Fixed constants for Java IDL object key template forms
56    public static final String JIDL_ORB_ID = "" ;
57    private static final String[] JIDL_OAID_STRINGS = { "TransientObjectAdapter" } ;
58    public static final ObjectAdapterId JIDL_OAID = new ObjectAdapterIdArray( JIDL_OAID_STRINGS ) ;
59
60    private ORB orb ;
61    protected IORSystemException wrapper ;
62    private ORBVersion version ;
63    private int magic ;
64    private int scid ;
65    private int serverid ;
66    private String orbid ;
67    private ObjectAdapterId oaid ;
68
69    private byte[] adapterId ;
70
71    public byte[] getAdapterId()
72    {
73        return (byte[])(adapterId.clone()) ;
74    }
75
76    private byte[] computeAdapterId()
77    {
78        // write out serverid, orbid, oaid
79        ByteBuffer buff = new ByteBuffer() ;
80
81        buff.append( getServerId() ) ;
82        buff.append( orbid ) ;
83
84        buff.append( oaid.getNumLevels() ) ;
85        Iterator iter = oaid.iterator() ;
86        while (iter.hasNext()) {
87            String comp = (String)(iter.next()) ;
88            buff.append( comp ) ;
89        }
90
91        buff.trimToSize() ;
92
93        return buff.toArray() ;
94    }
95
96    public ObjectKeyTemplateBase( ORB orb, int magic, int scid, int serverid,
97        String orbid, ObjectAdapterId oaid )
98    {
99        this.orb = orb ;
100        this.wrapper = IORSystemException.get( orb,
101            CORBALogDomains.OA_IOR ) ;
102        this.magic = magic ;
103        this.scid = scid ;
104        this.serverid = serverid ;
105        this.orbid = orbid ;
106        this.oaid = oaid ;
107
108        adapterId = computeAdapterId() ;
109    }
110
111    public boolean equals( Object obj )
112    {
113        if (!(obj instanceof ObjectKeyTemplateBase))
114            return false ;
115
116        ObjectKeyTemplateBase other = (ObjectKeyTemplateBase)obj ;
117
118        return (magic == other.magic) && (scid == other.scid) &&
119            (serverid == other.serverid) && (version.equals( other.version ) &&
120            orbid.equals( other.orbid ) && oaid.equals( other.oaid )) ;
121    }
122
123    public int hashCode()
124    {
125        int result = 17 ;
126        result = 37*result + magic ;
127        result = 37*result + scid ;
128        result = 37*result + serverid ;
129        result = 37*result + version.hashCode() ;
130        result = 37*result + orbid.hashCode() ;
131        result = 37*result + oaid.hashCode() ;
132        return result ;
133    }
134
135    public int getSubcontractId()
136    {
137        return scid ;
138    }
139
140    public int getServerId()
141    {
142        return serverid ;
143    }
144
145    public String getORBId()
146    {
147        return orbid ;
148    }
149
150    public ObjectAdapterId getObjectAdapterId()
151    {
152        return oaid ;
153    }
154
155    public void write(ObjectId objectId, OutputStream os)
156    {
157        writeTemplate( os ) ;
158        objectId.write( os ) ;
159    }
160
161    public void write( OutputStream os )
162    {
163        writeTemplate( os ) ;
164    }
165
166    abstract protected void writeTemplate( OutputStream os ) ;
167
168    protected int getMagic()
169    {
170        return magic ;
171    }
172
173    // All subclasses should set the version in their constructors.
174    // Public so it can be used in a white-box test.
175    public void setORBVersion( ORBVersion version )
176    {
177        this.version = version ;
178    }
179
180    public ORBVersion getORBVersion()
181    {
182        return version ;
183    }
184
185    protected byte[] readObjectKey( InputStream is )
186    {
187        int len = is.read_long() ;
188        byte[] result = new byte[len] ;
189        is.read_octet_array( result, 0, len ) ;
190        return result ;
191    }
192
193    public CorbaServerRequestDispatcher getServerRequestDispatcher( ORB orb, ObjectId id )
194    {
195        return orb.getRequestDispatcherRegistry().getServerRequestDispatcher( scid ) ;
196    }
197}
198