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.authorizationData;
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.authorizationData.actions.AuthorizationDataInit;
30 import org.apache.directory.shared.kerberos.codec.authorizationData.actions.StoreAdData;
31 import org.apache.directory.shared.kerberos.codec.authorizationData.actions.StoreAdType;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36 /**
37 * This class implements the AuthorizationData 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 AuthorizationDataGrammar extends AbstractGrammar<AuthorizationDataContainer>
44 {
45 /** The logger */
46 static final Logger LOG = LoggerFactory.getLogger( AuthorizationDataGrammar.class );
47
48 /** A speedup for logger */
49 static final boolean IS_DEBUG = LOG.isDebugEnabled();
50
51 /** The instance of grammar. AuthorizationDataGrammar is a singleton */
52 private static Grammar<AuthorizationDataContainer> instance = new AuthorizationDataGrammar();
53
54
55 /**
56 * Creates a new AuthorizationDataGrammar object.
57 */
58 @SuppressWarnings("unchecked")
59 private AuthorizationDataGrammar()
60 {
61 setName( AuthorizationDataGrammar.class.getName() );
62
63 // Create the transitions table
64 super.transitions = new GrammarTransition[AuthorizationDataStatesEnum.LAST_AUTHORIZATION_DATA_STATE.ordinal()][256];
65
66 // ============================================================================================
67 // AuthorizationData
68 // ============================================================================================
69 // --------------------------------------------------------------------------------------------
70 // Transition from AuthorizationData init to AuthorizationData SEQ OF
71 // --------------------------------------------------------------------------------------------
72 // AuthorizationData ::= SEQUENCE OF
73 super.transitions[AuthorizationDataStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
74 new GrammarTransition<AuthorizationDataContainer>(
75 AuthorizationDataStatesEnum.START_STATE,
76 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_SEQ_STATE,
77 UniversalTag.SEQUENCE,
78 new AuthorizationDataInit() );
79
80 // --------------------------------------------------------------------------------------------
81 // Transition from AuthorizationData SEQ OF to SEQ
82 // --------------------------------------------------------------------------------------------
83 // AuthorizationData ::= SEQUENCE OF SEQUENCE {
84 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_SEQ_STATE.ordinal()][UniversalTag.SEQUENCE
85 .getValue()] =
86 new GrammarTransition<AuthorizationDataContainer>(
87 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_SEQ_STATE,
88 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_STATE,
89 UniversalTag.SEQUENCE,
90 new CheckNotNullLength<AuthorizationDataContainer>() );
91
92 // --------------------------------------------------------------------------------------------
93 // Transition from AuthorizationData SEQ OF to adType tag
94 // --------------------------------------------------------------------------------------------
95 // AuthorizationData ::= SEQUENCE OF SEQUENCE {
96 // ad-type [0]
97 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_STATE.ordinal()][KerberosConstants.AUTHORIZATION_DATA_ADTYPE_TAG] =
98 new GrammarTransition<AuthorizationDataContainer>(
99 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_STATE,
100 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_TAG_STATE,
101 KerberosConstants.AUTHORIZATION_DATA_ADTYPE_TAG,
102 new CheckNotNullLength<AuthorizationDataContainer>() );
103
104 // --------------------------------------------------------------------------------------------
105 // Transition from adtype tag to adtype value
106 // --------------------------------------------------------------------------------------------
107 // AuthorizationData ::= SEQUENCE OF SEQUENCE {
108 // ad-type [0] Int32,
109 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_TAG_STATE.ordinal()][UniversalTag.INTEGER
110 .getValue()] =
111 new GrammarTransition<AuthorizationDataContainer>(
112 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_TAG_STATE,
113 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_STATE,
114 UniversalTag.INTEGER,
115 new StoreAdType() );
116
117 // --------------------------------------------------------------------------------------------
118 // Transition from ad-type value to ad-data tag
119 // --------------------------------------------------------------------------------------------
120 // AuthorizationData ::= SEQUENCE OF SEQUENCE {
121 // ...
122 // ad-data [1]
123 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_STATE.ordinal()][KerberosConstants.AUTHORIZATION_DATA_ADDATA_TAG] =
124 new GrammarTransition<AuthorizationDataContainer>(
125 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADTYPE_STATE,
126 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_TAG_STATE,
127 KerberosConstants.AUTHORIZATION_DATA_ADDATA_TAG,
128 new CheckNotNullLength<AuthorizationDataContainer>() );
129
130 // --------------------------------------------------------------------------------------------
131 // Transition from ad-data tag to ad-data value
132 // --------------------------------------------------------------------------------------------
133 // AuthorizationData ::= SEQUENCE OF SEQUENCE {
134 // ...
135 // ad-data [1] (OCTET STRING)
136 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
137 .getValue()] =
138 new GrammarTransition<AuthorizationDataContainer>(
139 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_TAG_STATE,
140 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_STATE,
141 UniversalTag.OCTET_STRING,
142 new StoreAdData() );
143
144 // --------------------------------------------------------------------------------------------
145 // Transition from ad-data value to SEQUENCE
146 // --------------------------------------------------------------------------------------------
147 // AuthorizationData ::= SEQUENCE {
148 // ...
149 // ad-data [1] (OCTET STRING)
150 super.transitions[AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_STATE.ordinal()][UniversalTag.SEQUENCE
151 .getValue()] =
152 new GrammarTransition<AuthorizationDataContainer>(
153 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_ADDATA_STATE,
154 AuthorizationDataStatesEnum.AUTHORIZATION_DATA_SEQ_STATE,
155 UniversalTag.SEQUENCE,
156 new CheckNotNullLength<AuthorizationDataContainer>() );
157 }
158
159
160 /**
161 * Get the instance of this grammar
162 *
163 * @return An instance on the AuthorizationData Grammar
164 */
165 public static Grammar<AuthorizationDataContainer> getInstance()
166 {
167 return instance;
168 }
169 }