OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [classpath/] [gnu/] [javax/] [naming/] [giop/] [ContextContinuation.java] - Blame information for rev 769

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 769 jeremybenn
/* ContextContinuation.java -- handles corbaname: urls
2
   Copyright (C) 2006 Free Software Foundation, Inc.
3
 
4
This file is part of GNU Classpath.
5
 
6
GNU Classpath is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
GNU Classpath is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU Classpath; see the file COPYING.  If not, write to the
18
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
02110-1301 USA.
20
 
21
Linking this library statically or dynamically with other modules is
22
making a combined work based on this library.  Thus, the terms and
23
conditions of the GNU General Public License cover the whole
24
combination.
25
 
26
As a special exception, the copyright holders of this library give you
27
permission to link this library with independent modules to produce an
28
executable, regardless of the license terms of these independent
29
modules, and to copy and distribute the resulting executable under
30
terms of your choice, provided that you also meet, for each linked
31
independent module, the terms and conditions of the license of that
32
module.  An independent module is a module which is not derived from
33
or based on this library.  If you modify this library, you may extend
34
this exception to your version of the library, but you are not
35
obligated to do so.  If you do not wish to do so, delete this
36
exception statement from your version. */
37
 
38
package gnu.javax.naming.giop;
39
 
40
import gnu.CORBA.NamingService.Ext;
41
import gnu.CORBA.NamingService.NameTransformer;
42
 
43
import java.util.Hashtable;
44
 
45
import javax.naming.Binding;
46
import javax.naming.Context;
47
import javax.naming.ContextNotEmptyException;
48
import javax.naming.InvalidNameException;
49
import javax.naming.Name;
50
import javax.naming.NameAlreadyBoundException;
51
import javax.naming.NameClassPair;
52
import javax.naming.NameNotFoundException;
53
import javax.naming.NameParser;
54
import javax.naming.NamingEnumeration;
55
import javax.naming.NamingException;
56
import javax.naming.OperationNotSupportedException;
57
import javax.naming.directory.InvalidAttributesException;
58
 
59
import org.omg.CORBA.ORB;
60
import org.omg.CORBA.portable.Delegate;
61
import org.omg.CORBA.portable.ObjectImpl;
62
import org.omg.CosNaming.BindingIteratorHolder;
63
import org.omg.CosNaming.BindingListHolder;
64
import org.omg.CosNaming.NameComponent;
65
import org.omg.CosNaming.NamingContext;
66
import org.omg.CosNaming.NamingContextExt;
67
import org.omg.CosNaming.NamingContextExtHelper;
68
import org.omg.CosNaming.NamingContextHelper;
69
import org.omg.CosNaming._NamingContextExtStub;
70
import org.omg.CosNaming._NamingContextStub;
71
import org.omg.CosNaming.NamingContextPackage.AlreadyBound;
72
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
73
import org.omg.CosNaming.NamingContextPackage.InvalidName;
74
import org.omg.CosNaming.NamingContextPackage.NotFound;
75
 
76
/**
77
 * The context to represent the corba naming service. Being the naming service,
78
 * the returned context supports creating the subcontexts, forwarding this task
79
 * to the existing naming service. When listing bindings, it uses the
80
 * {@link Context#BATCHSIZE} property to determine, how many bindings should
81
 * be returned at once (the process is transparend)
82
 *
83
 * @author Audrius Meskauskas (audriusa@Bioinformatics.org)
84
 */
85
public class ContextContinuation implements Context
86
{
87
  /**
88
   * This number of bindings will be requested from the naming server at once,
89
   * while the subsequent bindings will be requested via binding iterator one by
90
   * one. Use {@link Context#BATCHSIZE} to override the value of this constant.
91
   */
92
  public int DEFAULT_BATCH_SIZE = 20;
93
 
94
  /**
95
   * The actual CORBA naming service.
96
   */
97
  NamingContextExt service;
98
 
99
  /**
100
   * The object request broker, used to access the naming service. This field
101
   * is only initialised when the context is constructed from the URL.
102
   */
103
  ORB orb;
104
 
105
  /**
106
   * The properties.
107
   */
108
  Hashtable properties;
109
 
110
  /**
111
   * The parent factory.
112
   */
113
  GiopNamingServiceFactory factory;
114
 
115
  /**
116
   * The name transformer to obtain the name from its string representation. The
117
   * to_name method of the naming service is avoided as it may be remote and
118
   * hence expensive. The conversion rules are standard and cannot be service
119
   * specific.
120
   */
121
  static NameTransformer transformer = new NameTransformer();
122
 
123
  /**
124
   * The batch size for list operations - how many to return at once.
125
   */
126
  public final int howMany;
127
 
128
  /**
129
   * Creates a new naming context that uses naming service, represented by the
130
   * given CORBA object.
131
   *
132
   * @param nsObject
133
   *          the naming service object. It must be possible to narrow it into
134
   *          the NamingContextExt.
135
   * @param props
136
   *          the environment table.
137
   * @param anOrb
138
   *          the associated ORB. This reference is used during cleanup.
139
   * @param aFactory
140
   *          parent factory. This reference is used during cleanup.
141
   */
142
  public ContextContinuation(org.omg.CORBA.Object nsObject,
143
                                     Hashtable props, ORB anOrb,
144
                                     GiopNamingServiceFactory aFactory)
145
  {
146
    factory = aFactory;
147
    orb = anOrb;
148
 
149
    Delegate delegate = ((ObjectImpl) nsObject)._get_delegate();
150
 
151
    // If the IOR provides the IDL ID, we can check if our name
152
    // service is old NamingContext or new NamingContextExt.
153
    // Not all forms of the URL always provide the IDL id.
154
    if (!nsObject._is_a(NamingContextExtHelper.id())
155
        && nsObject._is_a(NamingContextHelper.id()))
156
      {
157
        // We are surely working with the old version.
158
        _NamingContextStub stub = new _NamingContextStub();
159
        stub._set_delegate(delegate);
160
        // The Ext object will add the necessary extensions.
161
        service = new Ext(stub);
162
      }
163
    else
164
      {
165
        // We expecte the service to be the NamingContextExt (this is true
166
        // for both Sun's and our implementations). There is no easy way
167
        // to check the version.
168
        _NamingContextExtStub stub = new _NamingContextExtStub();
169
        stub._set_delegate(delegate);
170
        service = stub;
171
      }
172
    properties = props;
173
    howMany = getBatchSize();
174
  }
175
 
176
  /**
177
   * Give the specified name for the specified object. The passed name must not
178
   * be already bound to some other object. The components of the name are
179
   * mapped into the components of the CORBA name.
180
   *
181
   * @param name
182
   *          the name that will be given to the object (in the scope of this
183
   *          context).
184
   * @param obj
185
   *          the object being named.
186
   * @throws NameAlreadyBoundException
187
   *           if this name is already used to name some object.
188
   * @throws InvalidAttributesException
189
   *           if the object does not supply all required attributes.
190
   * @throws NamingException
191
   *           if the naming operation has failed due other reasons.
192
   */
193
  public void bind(Name name, Object obj) throws NamingException
194
  {
195
    try
196
      {
197
        org.omg.CORBA.Object object = (org.omg.CORBA.Object) obj;
198
        service.bind(toGiop(name), object);
199
      }
200
    catch (ClassCastException e)
201
      {
202
        throw new NamingException(org.omg.CORBA.Object.class + " required ");
203
      }
204
    catch (InvalidName e)
205
      {
206
        throw new InvalidNameException();
207
      }
208
    catch (AlreadyBound e)
209
      {
210
        throw new NameAlreadyBoundException();
211
      }
212
    catch (Exception e)
213
      {
214
        throw new NamingException(e.toString());
215
      }
216
  }
217
 
218
  /**
219
   * Give the specified name for the specified object. The passed name must not
220
   * be already bound to some other object.
221
   *
222
   * @param name
223
   *          the name that will be given to the object (in the scope of this
224
   *          context).
225
   * @param obj
226
   *          the object being named.
227
   * @throws NameAlreadyBoundException
228
   *           if this name is already used to name some object.
229
   * @throws InvalidAttributesException
230
   *           if the object does not supply all required attributes.
231
   * @throws NamingException
232
   *           if the naming operation has failed due other reasons.
233
   */
234
  public void bind(String name, Object obj) throws NamingException
235
  {
236
    try
237
      {
238
        org.omg.CORBA.Object object = (org.omg.CORBA.Object) obj;
239
        service.bind(transformer.toName(name), object);
240
      }
241
    catch (ClassCastException e)
242
      {
243
        throw new NamingException(org.omg.CORBA.Object.class + " required ");
244
      }
245
    catch (InvalidName e)
246
      {
247
        throw new InvalidNameException();
248
      }
249
    catch (AlreadyBound e)
250
      {
251
        throw new NameAlreadyBoundException();
252
      }
253
    catch (Exception e)
254
      {
255
        throw new NamingException(e.toString());
256
      }
257
  }
258
 
259
  /**
260
   * Releases all resources, associated with this context. The close() method
261
   * can be called several times, but after it has been once invoked, it is not
262
   * allowed to call any other method of this context. This method destroys
263
   * the ORB, if we have one.
264
   *
265
   * @throws NamingException
266
   */
267
  public void close() throws NamingException
268
  {
269
    if (orb != null && factory !=null)
270
      {
271
        factory.checkIfReferenced(orb);
272
      }
273
  }
274
 
275
  /**
276
   * Not supported.
277
   */
278
  public Name composeName(Name name, Name prefix) throws NamingException
279
  {
280
    throw new OperationNotSupportedException();
281
  }
282
 
283
  /**
284
   * Not supported
285
   */
286
  public String composeName(String name1, String name2) throws NamingException
287
  {
288
    throw new OperationNotSupportedException();
289
  }
290
 
291
  /**
292
   * Creates the new naming subcontext and binds it to the current (this)
293
   * context. The returned object will wrap around the newly created CORBA
294
   * subcontext
295
   *
296
   * @param subContext
297
   *          the name of the new context being created
298
   * @return the newly created context, bound to the instance of the context on
299
   *         that the method has been called
300
   * @throws NameAlreadyBoundException
301
   *           if this name is already bound
302
   * @throws InvalidAttributesException
303
   *           if the creation of the new context requires the missing mandatory
304
   *           attributes
305
   * @throws NamingException
306
   */
307
  public Context createSubcontext(Name subContext) throws NamingException
308
  {
309
    try
310
      {
311
        org.omg.CORBA.Object subcontext = service.bind_new_context(
312
          toGiop(subContext));
313
        Hashtable clonedProps = new Hashtable();
314
        clonedProps.putAll(properties);
315
 
316
        // Nulls are passed both for orb and factory, as the child contexts
317
        // need not to do any cleanup.
318
        return new ContextContinuation(subcontext, clonedProps, null, null);
319
      }
320
    catch (AlreadyBound e)
321
      {
322
        throw new NameAlreadyBoundException();
323
      }
324
    catch (InvalidName e)
325
      {
326
        throw new InvalidNameException();
327
      }
328
    catch (Exception ex)
329
      {
330
        throw new NamingException(ex.toString());
331
      }
332
  }
333
 
334
  /**
335
   * Creates the new naming subcontext and binds it to the current (this)
336
   * context. The returned object will wrap around the newly created CORBA
337
   * subcontext
338
   *
339
   * @param subContext
340
   *          the name of the new context being created
341
   * @return the newly created context, bound to the instance of the context on
342
   *         that the method has been called
343
   * @throws NameAlreadyBoundException
344
   *           if this name is already bound
345
   * @throws InvalidAttributesException
346
   *           if the creation of the new context requires the missing mandatory
347
   *           attributes
348
   * @throws NamingException
349
   */
350
  public Context createSubcontext(String subContext) throws NamingException
351
  {
352
    try
353
      {
354
        org.omg.CORBA.Object subcontext =
355
          service.bind_new_context(transformer.toName(subContext));
356
        Hashtable clonedProps = new Hashtable();
357
        clonedProps.putAll(properties);
358
 
359
        // Nulls are passed both for orb and factory, as the child contexts
360
        // need not to do any cleanup.
361
        return new ContextContinuation(subcontext, clonedProps, null,
362
                                               null);
363
      }
364
    catch (AlreadyBound e)
365
      {
366
        throw new NameAlreadyBoundException(subContext);
367
      }
368
    catch (InvalidName e)
369
      {
370
        throw new InvalidNameException(subContext);
371
      }
372
    catch (Exception ex)
373
      {
374
        throw new NamingException(ex.toString());
375
      }
376
  }
377
 
378
  /**
379
   * Removes the naming subcontext from this naming context. Returns without
380
   * action if such subcontext does not exist. The context being destroyed must
381
   * be empty.
382
   *
383
   * @param subContext
384
   *          the name of the subcontext beig removed.
385
   * @throws ContextNotEmptyException
386
   *           if the named context is not empty.
387
   * @throws NamingException
388
   */
389
  public void destroySubcontext(Name subContext) throws NamingException
390
  {
391
    unbind(subContext);
392
  }
393
 
394
  /**
395
   * Removes the naming subcontext from this naming context. Returns without
396
   * action if such subcontext does not exist. The context being destroyed must
397
   * be empty.
398
   *
399
   * @param subContext
400
   *          the name of the subcontext beig removed.
401
   * @throws ContextNotEmptyException
402
   *           if the named context is not empty.
403
   * @throws NamingException
404
   */
405
  public void destroySubcontext(String subContext) throws NamingException
406
  {
407
    unbind(subContext);
408
  }
409
 
410
  /**
411
   * Returs the full name of this naming context. The returned string is not a
412
   * JNDI composite name and should not be passed directly to the methods of the
413
   * naming context. This implementation returns the IOR.
414
   *
415
   * @return the full name of this naming context, in its own namespace.
416
   * @throws OperationNotSupportedException
417
   *           if the naming system, represented by this context, does not
418
   *           support the notation of the full name.
419
   * @throws NamingException
420
   */
421
  public String getNameInNamespace() throws NamingException
422
  {
423
    if (orb != null)
424
      return orb.object_to_string(service);
425
    else
426
      {
427
        try
428
          {
429
            ObjectImpl impl = (ObjectImpl) service;
430
            return impl._orb().object_to_string(impl);
431
          }
432
        catch (ClassCastException e)
433
          {
434
            throw new UnsupportedOperationException();
435
          }
436
      }
437
  }
438
 
439
  /**
440
   * Not supported.
441
   */
442
  public NameParser getNameParser(Name name) throws NamingException
443
  {
444
    throw new UnsupportedOperationException();
445
  }
446
 
447
  /**
448
   * Not supported.
449
   */
450
  public NameParser getNameParser(String name) throws NamingException
451
  {
452
    throw new UnsupportedOperationException();
453
  }
454
 
455
  /**
456
   * Creates and returns the enumeration over the name bindings that are present
457
   * the given subcontext. The enumeration elements have the type of
458
   * {@link NameClassPair}, providing also information about the class of the
459
   * bound object. The behaviour in the case if the bindings are added or
460
   * removed later is not defined. The contents of the subcontexts are not
461
   * included.
462
   *
463
   * @param name
464
   *          the name of the subcontext
465
   * @return the enumeration over the names, known for the given subcontext.
466
   * @throws NamingException
467
   */
468
  public NamingEnumeration list(Name name) throws NamingException
469
  {
470
    BindingIteratorHolder bi = new BindingIteratorHolder();
471
    BindingListHolder bl = new BindingListHolder();
472
 
473
    NamingContext subcontext;
474
 
475
    if (name.size() == 0)
476
      subcontext = service;
477
    else
478
      {
479
        try
480
          {
481
            subcontext = (NamingContextHelper.narrow(service.resolve(toGiop(name))));
482
          }
483
        catch (Exception e)
484
          {
485
            throw new NamingException(e.toString());
486
          }
487
 
488
      }
489
 
490
    subcontext.list(howMany, bl, bi);
491
 
492
    return new ListEnumeration(bl, bi, howMany);
493
  }
494
 
495
  /**
496
   * Creates and returns the enumeration over the name bindings that are present
497
   * the given subcontext. The enumeration elements have the type of
498
   * {@link NameClassPair}, providing also information about the class of the
499
   * bound object. The behaviour in the case if the bindings are added or
500
   * removed later is not defined. The contents of the subcontexts are not
501
   * included.
502
   *
503
   * @param name
504
   *          the name of the subcontext
505
   * @return the enumeration over the names, known for the given subcontext.
506
   * @throws NamingException
507
   */
508
  public NamingEnumeration list(String name) throws NamingException
509
  {
510
    BindingIteratorHolder bi = new BindingIteratorHolder();
511
    BindingListHolder bl = new BindingListHolder();
512
 
513
    NamingContext subcontext;
514
 
515
    if (name.length() == 0)
516
      subcontext = service;
517
    else
518
      {
519
        try
520
          {
521
            subcontext = (NamingContextHelper.narrow(service.resolve_str(name)));
522
          }
523
        catch (Exception e)
524
          {
525
            throw new NamingException(e.toString());
526
          }
527
 
528
      }
529
 
530
    subcontext.list(howMany, bl, bi);
531
 
532
    return new ListEnumeration(bl, bi, howMany);
533
  }
534
 
535
  /**
536
   * Creates and returns the enumeration over the name - object bindings that
537
   * are present the given subcontext. The enumeration elements have the type of
538
   * {@link Binding}, providing also information about the class of the bound
539
   * object. The behaviour in the case if the bindings are added or removed
540
   * later is not defined. The contents of the subcontexts are not included.
541
   *
542
   * @param name
543
   *          the name of the subcontext
544
   * @return the enumeration over the names, known for the given subcontext.
545
   * @throws NamingException
546
   */
547
  public NamingEnumeration listBindings(Name name) throws NamingException
548
  {
549
    BindingIteratorHolder bi = new BindingIteratorHolder();
550
    BindingListHolder bl = new BindingListHolder();
551
 
552
    NamingContext subcontext;
553
 
554
    if (name.size() == 0)
555
      subcontext = service;
556
    else
557
      {
558
        try
559
          {
560
            subcontext = (NamingContextHelper.narrow(service.resolve(toGiop(name))));
561
          }
562
        catch (Exception e)
563
          {
564
            throw new NamingException(e.toString());
565
          }
566
      }
567
 
568
    subcontext.list(howMany, bl, bi);
569
 
570
    return new ListBindingsEnumeration(bl, bi, howMany, subcontext);
571
  }
572
 
573
  /**
574
   * Creates and returns the enumeration over the name - object bindings that
575
   * are present the given subcontext. The enumeration elements have the type of
576
   * {@link Binding}, providing also information about the class of the bound
577
   * object. The behaviour in the case if the bindings are added or removed
578
   * later is not defined. The contents of the subcontexts are not included.
579
   *
580
   * @param name
581
   *          the name of the subcontext
582
   * @return the enumeration over the names, known for the given subcontext.
583
   * @throws NamingException
584
   */
585
  public NamingEnumeration listBindings(String name) throws NamingException
586
  {
587
    BindingIteratorHolder bi = new BindingIteratorHolder();
588
    BindingListHolder bl = new BindingListHolder();
589
 
590
    NamingContext subcontext;
591
 
592
    if (name.length() == 0)
593
      subcontext = service;
594
    else
595
      {
596
        try
597
          {
598
            subcontext = (NamingContextHelper.narrow(service.resolve_str(name)));
599
          }
600
        catch (Exception e)
601
          {
602
            throw new NamingException(e.toString());
603
          }
604
 
605
      }
606
 
607
    subcontext.list(howMany, bl, bi);
608
 
609
    return new ListBindingsEnumeration(bl, bi, howMany, subcontext);
610
  }
611
 
612
  /**
613
   * Gets the previously named object by name. If the passed name is empty, the
614
   * method should return a cloned instance of this naming context.
615
   *
616
   * @param name
617
   *          the name of the object being searched in this context
618
   * @return the named object
619
   * @throws NameNotFountException
620
   *           if the name is not found
621
   */
622
  public Object lookup(Name name) throws NamingException
623
  {
624
    try
625
      {
626
        return service.resolve(toGiop(name));
627
      }
628
    catch (NotFound e)
629
      {
630
        throw new NameNotFoundException();
631
      }
632
    catch (InvalidName e)
633
      {
634
        throw new InvalidNameException();
635
      }
636
    catch (Exception e)
637
      {
638
        throw new NamingException(e.toString());
639
      }
640
  }
641
 
642
  /**
643
   * Gets the previously named object by name. If the passed name is empty, the
644
   * method should return a cloned instance of this naming context.
645
   *
646
   * @param name
647
   *          the name of the object being searched in this context
648
   * @return the named object
649
   * @throws NamingException
650
   *           if the naming fails.
651
   */
652
  public Object lookup(String name) throws NamingException
653
  {
654
    try
655
      {
656
        return service.resolve_str(name);
657
      }
658
    catch (NotFound e)
659
      {
660
        throw new NameNotFoundException();
661
      }
662
    catch (InvalidName e)
663
      {
664
        throw new InvalidNameException();
665
      }
666
    catch (Exception e)
667
      {
668
        throw new NamingException(e.toString());
669
      }
670
  }
671
 
672
  /**
673
   * Not supported.
674
   */
675
  public Object lookupLink(Name name) throws NamingException
676
  {
677
    throw new OperationNotSupportedException();
678
  }
679
 
680
  /**
681
   * Not supported.
682
   */
683
  public Object lookupLink(String name) throws NamingException
684
  {
685
    throw new OperationNotSupportedException();
686
  }
687
 
688
  /**
689
   * Give the specified name for the specified object. Unlike bind, this method
690
   * silently replaces the existing binding for this name, if one exists.
691
   *
692
   * @param name
693
   *          the name that will be given to the object (in the scope of this
694
   *          context).
695
   * @param obj
696
   *          the object being named.
697
   * @throws InvalidAttributesException
698
   *           if the object does not supply all required attributes.
699
   * @throws NamingException
700
   *           if the naming operation has failed due other reasons.
701
   */
702
  public void rebind(Name name, Object obj) throws NamingException
703
  {
704
    try
705
      {
706
        org.omg.CORBA.Object object = (org.omg.CORBA.Object) obj;
707
        service.rebind(toGiop(name), object);
708
      }
709
    catch (ClassCastException e)
710
      {
711
        throw new NamingException(org.omg.CORBA.Object.class + " required ");
712
      }
713
    catch (InvalidName e)
714
      {
715
        throw new InvalidNameException();
716
      }
717
    catch (Exception e)
718
      {
719
        throw new NamingException(e.toString());
720
      }
721
  }
722
 
723
  /**
724
   * Give the specified name for the specified object. Unlike bind, this method
725
   * silently replaces the existing binding for this name, if one exists.
726
   *
727
   * @param name
728
   *          the name that will be given to the object (in the scope of this
729
   *          context).
730
   * @param obj
731
   *          the object being named.
732
   * @throws InvalidAttributesException
733
   *           if the object does not supply all required attributes.
734
   * @throws NamingException
735
   *           if the naming operation has failed due other reasons.
736
   */
737
  public void rebind(String name, Object obj) throws NamingException
738
  {
739
    try
740
      {
741
        org.omg.CORBA.Object object = (org.omg.CORBA.Object) obj;
742
        service.rebind(transformer.toName(name), object);
743
      }
744
    catch (ClassCastException e)
745
      {
746
        throw new NamingException(org.omg.CORBA.Object.class + " required ");
747
      }
748
    catch (InvalidName e)
749
      {
750
        throw new InvalidNameException();
751
      }
752
    catch (Exception e)
753
      {
754
        throw new NamingException(e.toString());
755
      }
756
  }
757
 
758
  /**
759
   * Renames the existing binding, removing the existing and giving the new name
760
   * for the same object.
761
   *
762
   * @param oldName
763
   *          the existing name of the known object
764
   * @param newName
765
   *          the new name of the same object
766
   * @throws NameNotFoundException
767
   *           if the oldName is unknown for this context
768
   * @throws NamingException
769
   *           if the naming operation has failed due other reasons.
770
   */
771
  public void rename(Name oldName, Name newName) throws NamingException
772
  {
773
    Object object = lookup(oldName);
774
    unbind(oldName);
775
    bind(newName, object);
776
  }
777
 
778
  /**
779
   * Renames the existing binding, removing the existing and giving the new name
780
   * for the same object.
781
   *
782
   * @param oldName
783
   *          the existing name of the known object
784
   * @param newName
785
   *          the new name of the same object
786
   * @throws NameNotFoundException
787
   *           if the oldName is unknown for this context
788
   * @throws NamingException
789
   *           if the naming operation has failed due other reasons.
790
   */
791
  public void rename(String oldName, String newName) throws NamingException
792
  {
793
    Object object = lookup(oldName);
794
    unbind(oldName);
795
    bind(newName, object);
796
  }
797
 
798
  /**
799
   * Removes the name - object mapping from the current context. This method
800
   * returns without action if the name is not bound to an object in the
801
   * terminal context, but throws {@link NameNotFoundException} if one of the
802
   * intermadiate contexts does not exist.
803
   *
804
   * @param name
805
   *          the name to be removed
806
   * @throws NameNotFoundException
807
   *           if one of the intermediate naming contexts does not exist. Will
808
   *           not be thrown if just the terminal binding is missing.
809
   * @throws NamingException
810
   *           if the naming operation has failed due other reasons.
811
   */
812
  public void unbind(Name name) throws NamingException
813
  {
814
    try
815
      {
816
        service.unbind(toGiop(name));
817
      }
818
    catch (NotFound e)
819
      {
820
        throw new NameNotFoundException();
821
      }
822
    catch (CannotProceed e)
823
      {
824
        throw new ContextNotEmptyException();
825
      }
826
    catch (InvalidName e)
827
      {
828
        throw new InvalidNameException();
829
      }
830
  }
831
 
832
  /**
833
   * Removes the name - object mapping from the current context. This method
834
   * returns without action if the name is not bound to an object in the
835
   * terminal context, but throws {@link NameNotFoundException} if one of the
836
   * intermadiate contexts does not exist.
837
   *
838
   * @param name
839
   *          the name to be removed
840
   * @throws NameNotFoundException
841
   *           if one of the intermediate naming contexts does not exist. Will
842
   *           not be thrown if just the terminal binding is missing.
843
   * @throws NamingException
844
   *           if the naming operation has failed due other reasons.
845
   */
846
  public void unbind(String name) throws NamingException
847
  {
848
    try
849
      {
850
        service.unbind(transformer.toName(name));
851
      }
852
    catch (NotFound e)
853
      {
854
        throw new NameNotFoundException(name);
855
      }
856
    catch (CannotProceed e)
857
      {
858
        throw new ContextNotEmptyException(name);
859
      }
860
    catch (InvalidName e)
861
      {
862
        throw new InvalidNameException(name);
863
      }
864
  }
865
 
866
 /**
867
   * Add new environment property to the environment of this context. Both name
868
   * and value of the new property must not be null. If the property is already
869
   * defined, is current value is replaced by the propVal.
870
   *
871
   * @param key
872
   *          the name of the new property
873
   * @param value
874
   *          the value of the new property
875
   * @return the previous value of this property or null if the property has not
876
   *         been previously defined
877
   * @throws NamingException
878
   */
879
  public Object addToEnvironment(String key, Object value)
880
      throws NamingException
881
  {
882
    if (key == null || value == null)
883
      throw new NullPointerException();
884
    return properties.put(key, value);
885
  }
886
 
887
  /**
888
   * Returns the environment, associated with this naming context. The returned
889
   * table should never be modified by the caller. Use {@link #addToEnvironment}
890
   * and {@link #removeFromEnvironment} to modify the environement, if needed.
891
   *
892
   * @return the table, representing the environment of this context
893
   * @throws NamingException
894
   */
895
  public Hashtable getEnvironment() throws NamingException
896
  {
897
    return properties;
898
  }
899
 
900
  /**
901
   * Removes the property with the given name from the environment. Returns
902
   * without action if this property is not defined.
903
   *
904
   * @param propName
905
   *          the name of the property being removed.
906
   * @return the value of the property that has been removed or null if the
907
   *         property was not defined.
908
   * @throws NamingException
909
   */
910
  public Object removeFromEnvironment(String propName) throws NamingException
911
  {
912
    return properties.remove(propName);
913
  }
914
 
915
  /**
916
   * Convert the {@link Name} into array of the name components, required to the
917
   * CORBA naming service. First the string representation is obtained, then
918
   * it is converted using parsing rules of the CORBA name.
919
   *
920
   * @param name
921
   *          then name to convert
922
   * @return the converted array of components.
923
   */
924
  public NameComponent[] toGiop(Name name) throws InvalidName
925
  {
926
    return transformer.toName(name.toString());
927
  }
928
 
929
  /**
930
   * Get the batch size from the environment properties. The batch size is used
931
   * for listing operations.
932
   *
933
   * @return the batch size, or some default value if not specified.
934
   */
935
  public int getBatchSize()
936
  {
937
    int batchSize = DEFAULT_BATCH_SIZE;
938
    Object bs = properties.get(Context.BATCHSIZE);
939
    if (bs != null)
940
      {
941
        try
942
          {
943
            int b = Integer.parseInt(bs.toString());
944
            if (b >= 0)
945
              batchSize = b;
946
          }
947
        catch (NumberFormatException e)
948
          {
949
            // OK, use default value.
950
          }
951
      }
952
    return batchSize;
953
  }
954
 
955
 
956
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.