View Javadoc
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.changePwdData;
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.changePwdData.actions.ChangePasswdDataInit;
30  import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreNewPassword;
31  import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargName;
32  import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargRealm;
33  
34  
35  /**
36   * This class implements the ChangePasswdData message. All the actions are declared
37   * in this class. As it is a singleton, these declaration are only done once. If
38   * an action is to be added or modified, this is where the work is to be done !
39   *
40   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
41   */
42  public final class ChangePasswdDataGrammar extends AbstractGrammar<ChangePasswdDataContainer>
43  {
44      /** The instance of grammar. ChangePasswdDataGrammar is a singleton */
45      private static Grammar<ChangePasswdDataContainer> instance = new ChangePasswdDataGrammar();
46  
47  
48      /**
49       * Creates a new ChangePasswdDataGrammar object.
50       */
51      @SuppressWarnings("unchecked")
52      private ChangePasswdDataGrammar()
53      {
54          setName( ChangePasswdDataGrammar.class.getName() );
55  
56          // Create the transitions table
57          super.transitions = new GrammarTransition[ChangePasswdDataStatesEnum.LAST_CHNGPWD_STATE.ordinal()][256];
58  
59          // ============================================================================================
60          // ChangePasswdData
61          // ============================================================================================
62          // --------------------------------------------------------------------------------------------
63          // Transition from START to ChangePasswdData SEQ
64          // --------------------------------------------------------------------------------------------
65          // This is the starting state :
66          // ChangePasswdData          ::= SEQUENCE ...
67          super.transitions[ChangePasswdDataStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
68              new GrammarTransition<ChangePasswdDataContainer>(
69                  ChangePasswdDataStatesEnum.START_STATE,
70                  ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
71                  UniversalTag.SEQUENCE,
72                  new ChangePasswdDataInit() );
73  
74          // --------------------------------------------------------------------------------------------
75          // Transition from ChangePasswdData-SEQ to newPasswd tag
76          // --------------------------------------------------------------------------------------------
77          // ChangePasswdData          ::= SEQUENCE {
78          //         newPasswd         [0]
79          super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE.ordinal()][KerberosConstants.CHNGPWD_NEWPWD_TAG] =
80              new GrammarTransition<ChangePasswdDataContainer>(
81                  ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
82                  ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
83                  KerberosConstants.CHNGPWD_NEWPWD_TAG,
84                  new CheckNotNullLength<ChangePasswdDataContainer>() );
85  
86          // --------------------------------------------------------------------------------------------
87          // Transition from newPasswd tag to newPasswd
88          // --------------------------------------------------------------------------------------------
89          // ChangePasswdData          ::= SEQUENCE {
90          //         newPasswd         [0] OCTET STRING,
91          super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
92              .getValue()] =
93              new GrammarTransition<ChangePasswdDataContainer>(
94                  ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
95                  ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
96                  UniversalTag.OCTET_STRING,
97                  new StoreNewPassword() );
98  
99          // --------------------------------------------------------------------------------------------
100         // Transition from newPasswd to targName tag
101         // --------------------------------------------------------------------------------------------
102         // ChangePasswdData          ::= SEQUENCE {
103         //         newPasswd         [0] OCTET STRING,
104         //         targName          [1] PrincipalName OPTIONAL,
105         super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGNAME_TAG] =
106             new GrammarTransition<ChangePasswdDataContainer>(
107                 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
108                 ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE,
109                 KerberosConstants.CHNGPWD_TARGNAME_TAG,
110                 new StoreTargName() );
111 
112         // --------------------------------------------------------------------------------------------
113         // Transition from targName to targRealm tag
114         // --------------------------------------------------------------------------------------------
115         // ChangePasswdData          ::= SEQUENCE {
116         //         ...
117         //         targName          [1] PrincipalName OPTIONAL,
118         //         targRealm         [2] 
119         super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGREALM_TAG] =
120             new GrammarTransition<ChangePasswdDataContainer>(
121                 ChangePasswdDataStatesEnum.CHNGPWD_TARGNAME_TAG_STATE,
122                 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
123                 KerberosConstants.CHNGPWD_TARGREALM_TAG,
124                 new CheckNotNullLength<ChangePasswdDataContainer>() );
125 
126         // --------------------------------------------------------------------------------------------
127         // Transition from targRealm tag to targRealm
128         // --------------------------------------------------------------------------------------------
129         // ChangePasswdData          ::= SEQUENCE {
130         //         ...
131         //         targName          [1] PrincipalName OPTIONAL,
132         //         targRealm         [2] Realm OPTIONAL
133         super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE.ordinal()][UniversalTag.GENERAL_STRING
134             .getValue()] =
135             new GrammarTransition<ChangePasswdDataContainer>(
136                 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
137                 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_STATE,
138                 UniversalTag.GENERAL_STRING,
139                 new StoreTargRealm() );
140 
141         // --------------------------------------------------------------------------------------------
142         // Transition from newPasswd to targRealm tag
143         // --------------------------------------------------------------------------------------------
144         // ChangePasswdData          ::= SEQUENCE {
145         //         newPasswd         [0] OCTET STRING,
146         //         targRealm         [2] 
147         super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE.ordinal()][KerberosConstants.CHNGPWD_TARGREALM_TAG] =
148             new GrammarTransition<ChangePasswdDataContainer>(
149                 ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
150                 ChangePasswdDataStatesEnum.CHNGPWD_TARGREALM_TAG_STATE,
151                 KerberosConstants.CHNGPWD_TARGREALM_TAG,
152                 new CheckNotNullLength<ChangePasswdDataContainer>() );
153     }
154 
155 
156     /**
157      * Get the instance of this grammar
158      *
159      * @return An instance on the ChangePasswdData Grammar
160      */
161     public static Grammar<ChangePasswdDataContainer> getInstance()
162     {
163         return instance;
164     }
165 }