TransientNameService.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 1996, 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.naming.cosnaming;
27
28// Get CORBA type
29import org.omg.CORBA.INITIALIZE;
30import org.omg.CORBA.ORB;
31import org.omg.CORBA.CompletionStatus;
32
33import org.omg.CORBA.Policy;
34import org.omg.CORBA.INTERNAL;
35import org.omg.PortableServer.POA;
36import org.omg.PortableServer.LifespanPolicyValue;
37import org.omg.PortableServer.RequestProcessingPolicyValue;
38import org.omg.PortableServer.IdAssignmentPolicyValue;
39import org.omg.PortableServer.ServantRetentionPolicyValue;
40
41// Get org.omg.CosNaming types
42import org.omg.CosNaming.NamingContext;
43
44// Import transient naming context
45import com.sun.corba.se.impl.naming.cosnaming.TransientNamingContext;
46import com.sun.corba.se.impl.orbutil.ORBConstants;
47
48import com.sun.corba.se.spi.logging.CORBALogDomains;
49
50import com.sun.corba.se.impl.logging.NamingSystemException;
51
52/**
53 * Class TransientNameService implements a transient name service
54 * using TransientNamingContexts and TransientBindingIterators, which
55 * implement the org.omg.CosNaming::NamingContext and org.omg.CosNaming::BindingIterator
56 * interfaces specfied by the OMG Common Object Services Specification.
57 * <p>
58 * The TransientNameService creates the initial NamingContext object.
59 * @see NamingContextImpl
60 * @see BindingIteratorImpl
61 * @see TransientNamingContext
62 * @see TransientBindingIterator
63 */
64public class TransientNameService
65{
66    /**
67     * Constructs a new TransientNameService, and creates an initial
68     * NamingContext, whose object
69     * reference can be obtained by the initialNamingContext method.
70     * @param orb The ORB object
71     * @exception org.omg.CORBA.INITIALIZE Thrown if
72     * the TransientNameService cannot initialize.
73     */
74    public TransientNameService(com.sun.corba.se.spi.orb.ORB orb )
75        throws org.omg.CORBA.INITIALIZE
76    {
77        // Default constructor uses "NameService" as the key for the Root Naming
78        // Context. If default constructor is used then INS's object key for
79        // Transient Name Service is "NameService"
80        initialize( orb, "NameService" );
81    }
82
83    /**
84     * Constructs a new TransientNameService, and creates an initial
85     * NamingContext, whose object
86     * reference can be obtained by the initialNamingContext method.
87     * @param orb The ORB object
88     * @param nameserviceName Stringified key used for INS Service registry
89     * @exception org.omg.CORBA.INITIALIZE Thrown if
90     * the TransientNameService cannot initialize.
91     */
92    public TransientNameService(com.sun.corba.se.spi.orb.ORB orb,
93        String serviceName ) throws org.omg.CORBA.INITIALIZE
94    {
95        // This constructor gives the flexibility of providing the Object Key
96        // for the Root Naming Context that is registered with INS.
97        initialize( orb, serviceName );
98    }
99
100
101    /**
102     * This method initializes Transient Name Service by associating Root
103     * context with POA and registering the root context with INS Object Keymap.
104     */
105    private void initialize( com.sun.corba.se.spi.orb.ORB orb,
106        String nameServiceName )
107        throws org.omg.CORBA.INITIALIZE
108    {
109        NamingSystemException wrapper = NamingSystemException.get( orb,
110            CORBALogDomains.NAMING ) ;
111
112        try {
113            POA rootPOA = (POA) orb.resolve_initial_references(
114                ORBConstants.ROOT_POA_NAME );
115            rootPOA.the_POAManager().activate();
116
117            int i = 0;
118            Policy[] poaPolicy = new Policy[3];
119            poaPolicy[i++] = rootPOA.create_lifespan_policy(
120                LifespanPolicyValue.TRANSIENT);
121            poaPolicy[i++] = rootPOA.create_id_assignment_policy(
122                IdAssignmentPolicyValue.SYSTEM_ID);
123            poaPolicy[i++] = rootPOA.create_servant_retention_policy(
124                ServantRetentionPolicyValue.RETAIN);
125
126            POA nsPOA = rootPOA.create_POA( "TNameService", null, poaPolicy );
127            nsPOA.the_POAManager().activate();
128
129            // Create an initial context
130            TransientNamingContext initialContext =
131                new TransientNamingContext(orb, null, nsPOA);
132            byte[] rootContextId = nsPOA.activate_object( initialContext );
133            initialContext.localRoot =
134                nsPOA.id_to_reference( rootContextId );
135            theInitialNamingContext = initialContext.localRoot;
136            orb.register_initial_reference( nameServiceName,
137                theInitialNamingContext );
138        } catch (org.omg.CORBA.SystemException e) {
139            throw wrapper.transNsCannotCreateInitialNcSys( e ) ;
140        } catch (Exception e) {
141            throw wrapper.transNsCannotCreateInitialNc( e ) ;
142        }
143    }
144
145
146    /**
147     * Return the initial NamingContext.
148     * @return the object reference for the initial NamingContext.
149     */
150    public org.omg.CORBA.Object initialNamingContext()
151    {
152        return theInitialNamingContext;
153    }
154
155
156    // The initial naming context for this name service
157    private org.omg.CORBA.Object theInitialNamingContext;
158}
159