1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.directory.shared.kerberos.codec.transitedEncoding;
21
22
23 import org.apache.directory.api.asn1.actions.CheckNotNullLength;
24 import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
25 import org.apache.directory.api.asn1.ber.grammar.Grammar;
26 import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
27 import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
28 import org.apache.directory.shared.kerberos.KerberosConstants;
29 import org.apache.directory.shared.kerberos.codec.transitedEncoding.actions.StoreContents;
30 import org.apache.directory.shared.kerberos.codec.transitedEncoding.actions.StoreTrType;
31 import org.apache.directory.shared.kerberos.codec.transitedEncoding.actions.TransitedEncodingInit;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36 /**
37 * This class implements the TransitedEncoding structure. All the actions are declared
38 * in this class. As it is a singleton, these declaration are only done once. If
39 * an action is to be added or modified, this is where the work is to be done !
40 *
41 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
42 */
43 public final class TransitedEncodingGrammar extends AbstractGrammar<TransitedEncodingContainer>
44 {
45 /** The logger */
46 static final Logger LOG = LoggerFactory.getLogger( TransitedEncodingGrammar.class );
47
48 /** A speedup for logger */
49 static final boolean IS_DEBUG = LOG.isDebugEnabled();
50
51 /** The instance of grammar. TransitedEncodingGrammar is a singleton */
52 private static Grammar<TransitedEncodingContainer> instance = new TransitedEncodingGrammar();
53
54
55 /**
56 * Creates a new TransitedEncodingGrammar object.
57 */
58 @SuppressWarnings("unchecked")
59 private TransitedEncodingGrammar()
60 {
61 setName( TransitedEncodingGrammar.class.getName() );
62
63 // Create the transitions table
64 super.transitions = new GrammarTransition[TransitedEncodingStatesEnum.LAST_TRANSITED_ENCODING_STATE.ordinal()][256];
65
66 // ============================================================================================
67 // TransitedEncoding
68 // ============================================================================================
69 // --------------------------------------------------------------------------------------------
70 // Transition from TransitedEncoding init to TransitedEncoding SEQ
71 // --------------------------------------------------------------------------------------------
72 // TransitedEncoding ::= SEQUENCE {
73 super.transitions[TransitedEncodingStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
74 new GrammarTransition<TransitedEncodingContainer>(
75 TransitedEncodingStatesEnum.START_STATE,
76 TransitedEncodingStatesEnum.TRANSITED_ENCODING_SEQ_STATE,
77 UniversalTag.SEQUENCE,
78 new TransitedEncodingInit() );
79
80 // --------------------------------------------------------------------------------------------
81 // Transition from TransitedEncoding SEQ to tr-type tag
82 // --------------------------------------------------------------------------------------------
83 // TransitedEncoding ::= SEQUENCE {
84 // tr-type [0]
85 super.transitions[TransitedEncodingStatesEnum.TRANSITED_ENCODING_SEQ_STATE.ordinal()][KerberosConstants.TRANSITED_ENCODING_TR_TYPE_TAG] =
86 new GrammarTransition<TransitedEncodingContainer>(
87 TransitedEncodingStatesEnum.TRANSITED_ENCODING_SEQ_STATE,
88 TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_TAG_STATE,
89 KerberosConstants.TRANSITED_ENCODING_TR_TYPE_TAG,
90 new CheckNotNullLength<TransitedEncodingContainer>() );
91
92 // --------------------------------------------------------------------------------------------
93 // Transition from tr-type tag to tr-type value
94 // --------------------------------------------------------------------------------------------
95 // TransitedEncoding ::= SEQUENCE {
96 // tr-type [0] Int32 -- must be registered --,
97 super.transitions[TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_TAG_STATE.ordinal()][UniversalTag.INTEGER
98 .getValue()] =
99 new GrammarTransition<TransitedEncodingContainer>(
100 TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_TAG_STATE,
101 TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_STATE,
102 UniversalTag.INTEGER,
103 new StoreTrType() );
104
105 // --------------------------------------------------------------------------------------------
106 // Transition from tr-type value to contents tag
107 // --------------------------------------------------------------------------------------------
108 // TransitedEncoding ::= SEQUENCE {
109 // ...
110 // contents [1]
111 super.transitions[TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_STATE.ordinal()][KerberosConstants.TRANSITED_ENCODING_CONTENTS_TAG] =
112 new GrammarTransition<TransitedEncodingContainer>(
113 TransitedEncodingStatesEnum.TRANSITED_ENCODING_TR_TYPE_STATE,
114 TransitedEncodingStatesEnum.TRANSITED_ENCODING_CONTENTS_TAG_STATE,
115 KerberosConstants.TRANSITED_ENCODING_CONTENTS_TAG,
116 new CheckNotNullLength<TransitedEncodingContainer>() );
117
118 // --------------------------------------------------------------------------------------------
119 // Transition from contents tag to contents value
120 // --------------------------------------------------------------------------------------------
121 // TransitedEncoding ::= SEQUENCE {
122 // ...
123 // contents [1] OCTET STRING
124 super.transitions[TransitedEncodingStatesEnum.TRANSITED_ENCODING_CONTENTS_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
125 .getValue()] =
126 new GrammarTransition<TransitedEncodingContainer>(
127 TransitedEncodingStatesEnum.TRANSITED_ENCODING_CONTENTS_TAG_STATE,
128 TransitedEncodingStatesEnum.TRANSITED_ENCODING_CONTENTS_STATE,
129 UniversalTag.OCTET_STRING,
130 new StoreContents() );
131 }
132
133
134 /**
135 * Get the instance of this grammar
136 *
137 * @return An instance on the TransitedEncoding Grammar
138 */
139 public static Grammar<TransitedEncodingContainer> getInstance()
140 {
141 return instance;
142 }
143 }