View Javadoc

1   /*
2    *   Copyright 2004 The Apache Software Foundation
3    *
4    *   Licensed under the Apache License, Version 2.0 (the "License");
5    *   you may not use this file except in compliance with the License.
6    *   You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *   Unless required by applicable law or agreed to in writing, software
11   *   distributed under the License is distributed on an "AS IS" BASIS,
12   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *   See the License for the specific language governing permissions and
14   *   limitations under the License.
15   *
16   */
17  package org.apache.asn1.ber.primitives ;
18  
19  
20  import org.apache.asn1.ber.TagEnum ;
21  
22  
23  /***
24   * Type safe enum for ASN.1 UNIVERSAL class tags.  The tags values are
25   * constructed using the SNACC representation for tags without the 
26   * primitive/constructed bit.  This is done because several bit, octet and
27   * character string types can be encoded as primitives or as constructed types 
28   * to chunk the value out.
29   * <p>
30   * These tags can have one of the following values:
31   * <p>
32   * <table border=1 cellspacing=1 width=60% >
33   * <tr><th>Id</th><th>Usage</th></tr>
34   * <tr><td>[UNIVERSAL 0]</td>       <td>reserved for BER</td></tr>
35   * <tr><td>[UNIVERSAL 1]</td>       <td>BOOLEAN</td></tr>
36   * <tr><td>[UNIVERSAL 2]</td>       <td>INTEGER</td></tr>
37   * <tr><td>[UNIVERSAL 3]</td>       <td>BIT STRING</td></tr>
38   * <tr><td>[UNIVERSAL 4]</td>       <td>OCTET STRING</td></tr>
39   * <tr><td>[UNIVERSAL 5]</td>       <td>NULL</td></tr>
40   * <tr><td>[UNIVERSAL 6]</td>       <td>OBJECT IDENTIFIER</td></tr>
41   * <tr><td>[UNIVERSAL 7]</td>       <td>ObjectDescriptor</td></tr>
42   * <tr><td>[UNIVERSAL 8]</td>       <td>EXTERNAL, INSTANCE OF</td></tr>
43   * <tr><td>[UNIVERSAL 9]</td>       <td>REAL</td></tr>
44   * <tr><td>[UNIVERSAL 10]</td>      <td>ENUMERATED</td></tr>
45   * <tr><td>[UNIVERSAL 11]</td>      <td>EMBEDDED PDV</td></tr>
46   * <tr><td>[UNIVERSAL 12]</td>      <td>UTF8String</td></tr>
47   * <tr><td>[UNIVERSAL 13]</td>      <td>RELATIVE-OID</td></tr>
48   * <tr><td>[UNIVERSAL 14]</td>      <td>reserved for future use</td></tr>
49   * <tr><td>[UNIVERSAL 15]</td>      <td>reserved for future use</td></tr>
50   * <tr><td>[UNIVERSAL 16]</td>      <td>SEQUENCE, SEQUENCE OF</td></tr>
51   * <tr><td>[UNIVERSAL 17]</td>      <td>SET, SET OF</td></tr>
52   * <tr><td>[UNIVERSAL 18]</td>      <td>NumericString</td></tr>
53   * <tr><td>[UNIVERSAL 19]</td>      <td>PrintableString</td></tr>
54   * <tr><td>[UNIVERSAL 20]</td>      <td>TeletexString, T61String</td></tr>
55   * <tr><td>[UNIVERSAL 21]</td>      <td>VideotexString</td></tr>
56   * <tr><td>[UNIVERSAL 22]</td>      <td>IA5String</td></tr>
57   * <tr><td>[UNIVERSAL 23]</td>      <td>UTCTime</td></tr>
58   * <tr><td>[UNIVERSAL 24]</td>      <td>GeneralizedTime</td></tr>
59   * <tr><td>[UNIVERSAL 25]</td>      <td>GraphicString</td></tr>
60   * <tr><td>[UNIVERSAL 26]</td>      <td>VisibleString, ISO646String</td></tr>
61   * <tr><td>[UNIVERSAL 27]</td>      <td>GeneralString</td></tr>
62   * <tr><td>[UNIVERSAL 28]</td>      <td>UniversalString</td></tr>
63   * <tr><td>[UNIVERSAL 29]</td>      <td>CHARACTER STRING</td></tr>
64   * <tr><td>[UNIVERSAL 30]</td>      <td>BMPString</td></tr>
65   * <tr><td>[UNIVERSAL 31]</td>      <td>reserved for future use</td></tr>
66   * </table> 
67   * 
68   * @author <a href="mailto:dev@directory.apache.org">
69   * Apache Directory Project</a>
70   * @version $Rev: 289141 $
71   */
72  public class UniversalTag extends TagEnum
73  {
74      /*** value for the tag */
75      private static final int RESERVED0_VAL =                 0x00000000 ;
76      /*** value for the tag */
77      private static final int BOOLEAN_VAL =                   0x01000000 ;
78      /*** value for the tag */
79      private static final int INTEGER_VAL =                   0x02000000 ;
80      /*** value for the tag */
81      private static final int BIT_STRING_VAL =                0x03000000 ;
82      /*** value for the tag */
83      private static final int OCTET_STRING_VAL =              0x04000000 ;
84      /*** value for the tag */
85      private static final int NULL_VAL =                      0x05000000 ;
86      /*** value for the tag */
87      private static final int OBJECT_IDENTIFIER_VAL =         0x06000000 ;
88      /*** value for the tag */
89      private static final int OBJECT_DESCRIPTOR_VAL =         0x07000000 ;
90      /*** value for the tag */
91      private static final int EXTERNAL_INSTANCE_OF_VAL =      0x08000000 ;
92      /*** value for the tag */
93      private static final int REAL_VAL =                      0x09000000 ;
94      /*** value for the tag */
95      private static final int ENUMERATED_VAL =                0x0a000000 ;
96      /*** value for the tag */
97      private static final int EMBEDDED_PDV_VAL =              0x0b000000 ;
98      /*** value for the tag */
99      private static final int UTF8_STRING_VAL =               0x0c000000 ;
100     /*** value for the tag */
101     private static final int RELATIVE_OID_VAL =              0x0d000000 ;
102     /*** value for the tag */
103     private static final int RESERVED14_VAL =                0x0e000000 ;
104     /*** value for the tag */
105     private static final int RESERVED15_VAL =                0x0f000000 ;
106     /*** value for the tag */
107     private static final int SEQUENCE_SEQUENCE_OF_VAL =      0x10000000 ;
108     /*** value for the tag */
109     private static final int SET_SET_OF_VAL =                0x11000000 ;
110     /*** value for the tag */
111     private static final int NUMERIC_STRING_VAL =            0x12000000 ;
112     /*** value for the tag */
113     private static final int PRINTABLE_STRING_VAL =          0x13000000 ;
114     /*** value for the tag */
115     private static final int TELETEX_STRING_VAL =            0x14000000 ;
116     /*** value for the tag */
117     private static final int VIDEOTEX_STRING_VAL =           0x15000000 ;
118     /*** value for the tag */
119     private static final int IA5_STRING_VAL =                0x16000000 ;
120     /*** value for the tag */
121     private static final int UTC_TIME_VAL =                  0x17000000 ;
122     /*** value for the tag */
123     private static final int GENERALIZED_TIME_VAL =          0x18000000 ;
124     /*** value for the tag */
125     private static final int GRAPHIC_STRING_VAL =            0x19000000 ;
126     /*** value for the tag */
127     private static final int VISIBLE_STRING_VAL =            0x1a000000 ;
128     /*** value for the tag */
129     private static final int GENERAL_STRING_VAL =            0x1b000000 ;
130     /*** value for the tag */
131     private static final int UNIVERSAL_STRING_VAL =          0x1c000000 ;
132     /*** value for the tag */
133     private static final int CHARACTER_STRING_VAL =          0x1d000000 ;
134     /*** value for the tag */
135     private static final int BMP_STRING_VAL =                0x1e000000 ;
136     /*** value for the tag */
137     private static final int RESERVED31_VAL =                0x1f000000 ;
138 
139     /*** value for the tag */
140     private static final int RESERVED0_ID =                 0 ;
141     /*** value for the tag */
142     private static final int BOOLEAN_ID =                   1 ;
143     /*** value for the tag */
144     private static final int INTEGER_ID =                   2 ;
145     /*** value for the tag */
146     private static final int BIT_STRING_ID =                3 ;
147     /*** value for the tag */
148     private static final int OCTET_STRING_ID =              4 ;
149     /*** value for the tag */
150     private static final int NULL_ID =                      5 ;
151     /*** value for the tag */
152     private static final int OBJECT_IDENTIFIER_ID =         6 ;
153     /*** value for the tag */
154     private static final int OBJECT_DESCRIPTOR_ID =         7 ;
155     /*** value for the tag */
156     private static final int EXTERNAL_INSTANCE_OF_ID =      8 ;
157     /*** value for the tag */
158     private static final int REAL_ID =                      9 ;
159     /*** value for the tag */
160     private static final int ENUMERATED_ID =                10 ;
161     /*** value for the tag */
162     private static final int EMBEDDED_PDV_ID =              11 ;
163     /*** value for the tag */
164     private static final int UTF8_STRING_ID =               12 ;
165     /*** value for the tag */
166     private static final int RELATIVE_OID_ID =              13 ;
167     /*** value for the tag */
168     private static final int RESERVED14_ID =                14 ;
169     /*** value for the tag */
170     private static final int RESERVED15_ID =                15 ;
171     /*** value for the tag */
172     private static final int SEQUENCE_SEQUENCE_OF_ID =      16 ;
173     /*** value for the tag */
174     private static final int SET_SET_OF_ID =                17 ;
175     /*** value for the tag */
176     private static final int NUMERIC_STRING_ID =            18 ;
177     /*** value for the tag */
178     private static final int PRINTABLE_STRING_ID =          19 ;
179     /*** value for the tag */
180     private static final int TELETEX_STRING_ID =            20 ;
181     /*** value for the tag */
182     private static final int VIDEOTEX_STRING_ID =           21 ;
183     /*** value for the tag */
184     private static final int IA5_STRING_ID =                22 ;
185     /*** value for the tag */
186     private static final int UTC_TIME_ID =                  23 ;
187     /*** value for the tag */
188     private static final int GENERALIZED_TIME_ID =          24 ;
189     /*** value for the tag */
190     private static final int GRAPHIC_STRING_ID =            25 ;
191     /*** value for the tag */
192     private static final int VISIBLE_STRING_ID =            26 ;
193     /*** value for the tag */
194     private static final int GENERAL_STRING_ID =            27 ;
195     /*** value for the tag */
196     private static final int UNIVERSAL_STRING_ID =          28 ;
197     /*** value for the tag */
198     private static final int CHARACTER_STRING_ID =          29 ;
199     /*** value for the tag */
200     private static final int BMP_STRING_ID =                30 ;
201     /*** value for the tag */
202     private static final int RESERVED31_ID =                31 ;
203 
204     /*** enum for the tag */
205     public static final UniversalTag BOOLEAN = 
206         new UniversalTag( "BOOLEAN", BOOLEAN_VAL, BOOLEAN_ID ) ;
207     /*** enum for the tag */
208     public static final UniversalTag RESERVED0 = 
209         new UniversalTag( "RESERVED0", RESERVED0_VAL, RESERVED0_ID ) ;
210     /*** enum for the tag */
211     public static final UniversalTag INTEGER = 
212         new UniversalTag( "INTEGER", INTEGER_VAL, INTEGER_ID ) ;
213     /*** enum for the tag */
214     public static final UniversalTag BIT_STRING = 
215         new UniversalTag( "BIT_STRING", BIT_STRING_VAL, BIT_STRING_ID ) ;
216     /*** enum for the tag */
217     public static final UniversalTag OCTET_STRING = 
218         new UniversalTag( "OCTET_STRING", OCTET_STRING_VAL, OCTET_STRING_ID ) ;
219     /*** enum for the tag */
220     public static final UniversalTag NULL = 
221         new UniversalTag( "NULL", NULL_VAL, NULL_ID ) ;
222     /*** enum for the tag */
223     public static final UniversalTag OBJECT_IDENTIFIER = 
224         new UniversalTag( "OBJECT_IDENTIFIER", OBJECT_IDENTIFIER_VAL,
225                 OBJECT_IDENTIFIER_ID ) ;
226     /*** enum for the tag */
227     public static final UniversalTag OBJECT_DESCRIPTOR = 
228         new UniversalTag( "OBJECT_DESCRIPTOR", OBJECT_DESCRIPTOR_VAL,
229                 OBJECT_DESCRIPTOR_ID ) ;
230     /*** enum for the tag */
231     public static final UniversalTag EXTERNAL_INSTANCE_OF = 
232         new UniversalTag( "EXTERNAL_INSTANCE_OF", EXTERNAL_INSTANCE_OF_VAL,
233                 EXTERNAL_INSTANCE_OF_ID ) ;
234     /*** enum for the tag */
235     public static final UniversalTag REAL = 
236         new UniversalTag( "REAL", REAL_VAL, REAL_ID ) ;
237     /*** enum for the tag */
238     public static final UniversalTag ENUMERATED = 
239         new UniversalTag( "ENUMERATED", ENUMERATED_VAL, ENUMERATED_ID ) ;
240     /*** enum for the tag */
241     public static final UniversalTag EMBEDDED_PDV = 
242         new UniversalTag( "EMBEDDED_PDV", EMBEDDED_PDV_VAL, EMBEDDED_PDV_ID ) ;
243     /*** enum for the tag */
244     public static final UniversalTag UTF8_STRING = 
245         new UniversalTag( "UTF8_STRING", UTF8_STRING_VAL, UTF8_STRING_ID ) ;
246     /*** enum for the tag */
247     public static final UniversalTag RELATIVE_OID = 
248         new UniversalTag( "RELATIVE_OID", RELATIVE_OID_VAL, RELATIVE_OID_ID ) ;
249     /*** enum for the tag */
250     public static final UniversalTag RESERVED14 = 
251         new UniversalTag( "RESERVED14", RESERVED14_VAL, RESERVED14_ID ) ;
252     /*** enum for the tag */
253     public static final UniversalTag RESERVED15 = 
254         new UniversalTag( "RESERVED15", RESERVED15_VAL, RESERVED15_ID ) ;
255     /*** enum for the tag */
256     public static final UniversalTag SEQUENCE_SEQUENCE_OF = 
257         new UniversalTag( "SEQUENCE_SEQUENCE_OF", SEQUENCE_SEQUENCE_OF_VAL,
258                 SEQUENCE_SEQUENCE_OF_ID ) ;
259     /*** enum for the tag */
260     public static final UniversalTag SET_SET_OF = 
261         new UniversalTag( "SET_SET_OF", SET_SET_OF_VAL, SET_SET_OF_ID ) ;
262     /*** enum for the tag */
263     public static final UniversalTag NUMERIC_STRING = 
264         new UniversalTag( "NUMERIC_STRING", NUMERIC_STRING_VAL,
265                 NUMERIC_STRING_ID ) ;
266     /*** enum for the tag */
267     public static final UniversalTag PRINTABLE_STRING = 
268         new UniversalTag( "PRINTABLE_STRING", PRINTABLE_STRING_VAL,
269                 PRINTABLE_STRING_ID ) ;
270     /*** enum for the tag */
271     public static final UniversalTag TELETEX_STRING = 
272         new UniversalTag( "TELETEX_STRING", TELETEX_STRING_VAL,
273                 TELETEX_STRING_ID ) ;
274     /*** enum for the tag */
275     public static final UniversalTag VIDEOTEX_STRING = 
276         new UniversalTag( "VIDEOTEX_STRING", VIDEOTEX_STRING_VAL,
277                 VIDEOTEX_STRING_ID ) ;
278     /*** enum for the tag */
279     public static final UniversalTag IA5_STRING = 
280         new UniversalTag( "IA5_STRING", IA5_STRING_VAL, IA5_STRING_ID ) ;
281     /*** enum for the tag */
282     public static final UniversalTag UTC_TIME = 
283         new UniversalTag( "UTC_TIME", UTC_TIME_VAL, UTC_TIME_ID ) ;
284     /*** enum for the tag */
285     public static final UniversalTag GENERALIZED_TIME = 
286         new UniversalTag( "GENERALIZED_TIME", GENERALIZED_TIME_VAL,
287                 GENERALIZED_TIME_ID ) ;
288     /*** enum for the tag */
289     public static final UniversalTag GRAPHIC_STRING = 
290         new UniversalTag( "GRAPHIC_STRING", GRAPHIC_STRING_VAL,
291                 GRAPHIC_STRING_ID ) ;
292     /*** enum for the tag */
293     public static final UniversalTag VISIBLE_STRING = 
294         new UniversalTag( "VISIBLE_STRING", VISIBLE_STRING_VAL,
295                 VISIBLE_STRING_ID ) ;
296     /*** enum for the tag */
297     public static final UniversalTag GENERAL_STRING = 
298         new UniversalTag( "GENERAL_STRING", GENERAL_STRING_VAL,
299                 GENERAL_STRING_ID ) ;
300     /*** enum for the tag */
301     public static final UniversalTag UNIVERSAL_STRING = 
302         new UniversalTag( "UNIVERSAL_STRING", UNIVERSAL_STRING_VAL,
303                 UNIVERSAL_STRING_ID ) ;
304     /*** enum for the tag */
305     public static final UniversalTag CHARACTER_STRING = 
306         new UniversalTag( "CHARACTER_STRING", CHARACTER_STRING_VAL,
307                 CHARACTER_STRING_ID ) ;
308     /*** enum for the tag */
309     public static final UniversalTag BMP_STRING = 
310         new UniversalTag( "BMP_STRING", BMP_STRING_VAL, BMP_STRING_ID ) ;
311     /*** enum for the tag */
312     public static final UniversalTag RESERVED31 = 
313         new UniversalTag( "RESERVED31", RESERVED31_VAL, RESERVED31_ID ) ;
314 
315 
316     // -----------------------------------------------------------------------
317     // C O N S T R U C T O R S
318     // -----------------------------------------------------------------------
319 
320 
321     /***
322      * Private constructor so no other instances can be created other than the
323      * public static constants in this class.
324      *
325      * @param name a string name for the enumeration value.
326      * @param value the integer value of the enumeration.
327      */
328     private UniversalTag( final String name, final int value, final int id )
329     {
330         super( name, value, id ) ;
331     }
332 
333 
334     // -----------------------------------------------------------------------
335     // Members
336     // -----------------------------------------------------------------------
337 
338 
339     /***
340      * Gets the ASN.1 UNIVERSAL type tag's enum using a tag value.
341      * 
342      * @param value the first octet of the TLV
343      * @return the valued enum for the ASN.1 UNIVERSAL type tag
344      */
345     public static UniversalTag getUniversalTag( int value )
346     {
347         UniversalTag type = null ;
348         value &= 0xdfffffff ;
349         
350         switch ( value )
351         {
352             case( RESERVED0_VAL ):
353                 type = RESERVED0 ;
354                 break ;
355             case( BOOLEAN_VAL ):
356                 type = BOOLEAN ;
357                 break ;
358             case( INTEGER_VAL ):
359                 type = INTEGER ;
360                 break ;
361             case( BIT_STRING_VAL ):
362                 type = BIT_STRING ;
363                 break ;
364             case( OCTET_STRING_VAL ):
365                 type = OCTET_STRING ;
366                 break ;
367             case( NULL_VAL ):
368                 type = NULL ;
369                 break ;
370             case( OBJECT_IDENTIFIER_VAL ):
371                 type = OBJECT_IDENTIFIER ;
372                 break ;
373             case( OBJECT_DESCRIPTOR_VAL ):
374                 type = OBJECT_DESCRIPTOR ;
375                 break ;
376             case( EXTERNAL_INSTANCE_OF_VAL ):
377                 type = EXTERNAL_INSTANCE_OF ;
378                 break ;
379             case( REAL_VAL ):
380                 type = REAL ;
381                 break ;
382             case( ENUMERATED_VAL ):
383                 type = ENUMERATED ;
384                 break ;
385             case( EMBEDDED_PDV_VAL ):
386                 type = EMBEDDED_PDV ;
387                 break ;
388             case( UTF8_STRING_VAL ):
389                 type = UTF8_STRING ;
390                 break ;
391             case( RELATIVE_OID_VAL ):
392                 type = RELATIVE_OID ;
393                 break ;
394             case( RESERVED14_VAL ):
395                 type = RESERVED14 ;
396                 break ;
397             case( RESERVED15_VAL ):
398                 type = RESERVED15 ;
399                 break ;
400             case( SEQUENCE_SEQUENCE_OF_VAL ):
401                 type = SEQUENCE_SEQUENCE_OF ;
402                 break ;
403             case( SET_SET_OF_VAL ):
404                 type = SET_SET_OF ;
405                 break ;
406             case( NUMERIC_STRING_VAL ):
407                 type = NUMERIC_STRING ;
408                 break ;
409             case( PRINTABLE_STRING_VAL ):
410                 type = PRINTABLE_STRING ;
411                 break ;
412             case( TELETEX_STRING_VAL ):
413                 type = TELETEX_STRING ;
414                 break ;
415             case( VIDEOTEX_STRING_VAL ):
416                 type = VIDEOTEX_STRING ;
417                 break ;
418             case( IA5_STRING_VAL ):
419                 type = IA5_STRING ;
420                 break ;
421             case( UTC_TIME_VAL ):
422                 type = UTC_TIME ;
423                 break ;
424             case( GENERALIZED_TIME_VAL ):
425                 type = GENERALIZED_TIME ;
426                 break ;
427             case( GRAPHIC_STRING_VAL ):
428                 type = GRAPHIC_STRING ;
429                 break ;
430             case( VISIBLE_STRING_VAL ):
431                 type = VISIBLE_STRING ;
432                 break ;
433             case( GENERAL_STRING_VAL ):
434                 type = GENERAL_STRING ;
435                 break ;
436             case( UNIVERSAL_STRING_VAL ):
437                 type = UNIVERSAL_STRING ;
438                 break ;
439             case( CHARACTER_STRING_VAL ):
440                 type = CHARACTER_STRING ;
441                 break ;
442             case( BMP_STRING_VAL ):
443                 type = BMP_STRING ;
444                 break ;
445             case( RESERVED31_VAL ):
446                 type = RESERVED31 ;
447                 break ;
448             default:
449                 String msg ;
450                 if ( value < 31 && value > -1 )
451                 {
452                     msg = "Looks like you're using an id instead of a tag" ;
453                 }
454                 else
455                 {
456                     msg = "Tag value of " + value + " not recognized" ;
457                 }
458 
459                 throw new IllegalArgumentException( msg ) ;
460         }
461         
462         return type ;
463     }
464 
465 
466     /***
467      * Gets the ASN.1 UNIVERSAL type tag's enum using a tag value.
468      *
469      * @param id the first octet of the TLV
470      * @return the valued enum for the ASN.1 UNIVERSAL type tag
471      */
472     public static UniversalTag getUniversalTagById( int id )
473     {
474         UniversalTag type = null ;
475 
476         switch ( id )
477         {
478             case( RESERVED0_ID ):
479                 type = RESERVED0 ;
480                 break ;
481             case( BOOLEAN_ID ):
482                 type = BOOLEAN ;
483                 break ;
484             case( INTEGER_ID ):
485                 type = INTEGER ;
486                 break ;
487             case( BIT_STRING_ID ):
488                 type = BIT_STRING ;
489                 break ;
490             case( OCTET_STRING_ID ):
491                 type = OCTET_STRING ;
492                 break ;
493             case( NULL_ID ):
494                 type = NULL ;
495                 break ;
496             case( OBJECT_IDENTIFIER_ID ):
497                 type = OBJECT_IDENTIFIER ;
498                 break ;
499             case( OBJECT_DESCRIPTOR_ID ):
500                 type = OBJECT_DESCRIPTOR ;
501                 break ;
502             case( EXTERNAL_INSTANCE_OF_ID ):
503                 type = EXTERNAL_INSTANCE_OF ;
504                 break ;
505             case( REAL_ID ):
506                 type = REAL ;
507                 break ;
508             case( ENUMERATED_ID ):
509                 type = ENUMERATED ;
510                 break ;
511             case( EMBEDDED_PDV_ID ):
512                 type = EMBEDDED_PDV ;
513                 break ;
514             case( UTF8_STRING_ID ):
515                 type = UTF8_STRING ;
516                 break ;
517             case( RELATIVE_OID_ID ):
518                 type = RELATIVE_OID ;
519                 break ;
520             case( RESERVED14_ID ):
521                 type = RESERVED14 ;
522                 break ;
523             case( RESERVED15_ID ):
524                 type = RESERVED15 ;
525                 break ;
526             case( SEQUENCE_SEQUENCE_OF_ID ):
527                 type = SEQUENCE_SEQUENCE_OF ;
528                 break ;
529             case( SET_SET_OF_ID ):
530                 type = SET_SET_OF ;
531                 break ;
532             case( NUMERIC_STRING_ID ):
533                 type = NUMERIC_STRING ;
534                 break ;
535             case( PRINTABLE_STRING_ID ):
536                 type = PRINTABLE_STRING ;
537                 break ;
538             case( TELETEX_STRING_ID ):
539                 type = TELETEX_STRING ;
540                 break ;
541             case( VIDEOTEX_STRING_ID ):
542                 type = VIDEOTEX_STRING ;
543                 break ;
544             case( IA5_STRING_ID ):
545                 type = IA5_STRING ;
546                 break ;
547             case( UTC_TIME_ID ):
548                 type = UTC_TIME ;
549                 break ;
550             case( GENERALIZED_TIME_ID ):
551                 type = GENERALIZED_TIME ;
552                 break ;
553             case( GRAPHIC_STRING_ID ):
554                 type = GRAPHIC_STRING ;
555                 break ;
556             case( VISIBLE_STRING_ID ):
557                 type = VISIBLE_STRING ;
558                 break ;
559             case( GENERAL_STRING_ID ):
560                 type = GENERAL_STRING ;
561                 break ;
562             case( UNIVERSAL_STRING_ID ):
563                 type = UNIVERSAL_STRING ;
564                 break ;
565             case( CHARACTER_STRING_ID ):
566                 type = CHARACTER_STRING ;
567                 break ;
568             case( BMP_STRING_ID ):
569                 type = BMP_STRING ;
570                 break ;
571             case( RESERVED31_ID ):
572                 type = RESERVED31 ;
573                 break ;
574             default:
575                 String msg ;
576                 if ( id > 31 || id < 0 )
577                 {
578                     msg = "Looks like you're using a tag instead of an id" ;
579                 }
580                 else
581                 {
582                     msg = "Id of " + id + " not recognized as a universal id" ;
583                 }
584 
585                 throw new IllegalArgumentException( msg ) ;
586         }
587 
588         return type ;
589     }
590 }