001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *  
010 *    http://www.apache.org/licenses/LICENSE-2.0
011 *  
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License. 
018 *  
019 */
020package org.apache.directory.shared.kerberos.codec.changePwdData;
021
022
023import org.apache.directory.api.asn1.actions.CheckNotNullLength;
024import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
025import org.apache.directory.api.asn1.ber.grammar.Grammar;
026import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
027import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
028import org.apache.directory.shared.kerberos.KerberosConstants;
029import org.apache.directory.shared.kerberos.codec.changePwdData.actions.ChangePasswdDataInit;
030import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreNewPassword;
031import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargName;
032import org.apache.directory.shared.kerberos.codec.changePwdData.actions.StoreTargRealm;
033
034
035/**
036 * This class implements the ChangePasswdData message. All the actions are declared
037 * in this class. As it is a singleton, these declaration are only done once. If
038 * an action is to be added or modified, this is where the work is to be done !
039 *
040 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
041 */
042public final class ChangePasswdDataGrammar extends AbstractGrammar<ChangePasswdDataContainer>
043{
044    /** The instance of grammar. ChangePasswdDataGrammar is a singleton */
045    private static Grammar<ChangePasswdDataContainer> instance = new ChangePasswdDataGrammar();
046
047
048    /**
049     * Creates a new ChangePasswdDataGrammar object.
050     */
051    @SuppressWarnings("unchecked")
052    private ChangePasswdDataGrammar()
053    {
054        setName( ChangePasswdDataGrammar.class.getName() );
055
056        // Create the transitions table
057        super.transitions = new GrammarTransition[ChangePasswdDataStatesEnum.LAST_CHNGPWD_STATE.ordinal()][256];
058
059        // ============================================================================================
060        // ChangePasswdData
061        // ============================================================================================
062        // --------------------------------------------------------------------------------------------
063        // Transition from START to ChangePasswdData SEQ
064        // --------------------------------------------------------------------------------------------
065        // This is the starting state :
066        // ChangePasswdData          ::= SEQUENCE ...
067        super.transitions[ChangePasswdDataStatesEnum.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] =
068            new GrammarTransition<ChangePasswdDataContainer>(
069                ChangePasswdDataStatesEnum.START_STATE,
070                ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
071                UniversalTag.SEQUENCE,
072                new ChangePasswdDataInit() );
073
074        // --------------------------------------------------------------------------------------------
075        // Transition from ChangePasswdData-SEQ to newPasswd tag
076        // --------------------------------------------------------------------------------------------
077        // ChangePasswdData          ::= SEQUENCE {
078        //         newPasswd         [0]
079        super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE.ordinal()][KerberosConstants.CHNGPWD_NEWPWD_TAG] =
080            new GrammarTransition<ChangePasswdDataContainer>(
081                ChangePasswdDataStatesEnum.CHNGPWD_SEQ_STATE,
082                ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
083                KerberosConstants.CHNGPWD_NEWPWD_TAG,
084                new CheckNotNullLength<ChangePasswdDataContainer>() );
085
086        // --------------------------------------------------------------------------------------------
087        // Transition from newPasswd tag to newPasswd
088        // --------------------------------------------------------------------------------------------
089        // ChangePasswdData          ::= SEQUENCE {
090        //         newPasswd         [0] OCTET STRING,
091        super.transitions[ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE.ordinal()][UniversalTag.OCTET_STRING
092            .getValue()] =
093            new GrammarTransition<ChangePasswdDataContainer>(
094                ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_TAG_STATE,
095                ChangePasswdDataStatesEnum.CHNGPWD_NEWPASSWD_STATE,
096                UniversalTag.OCTET_STRING,
097                new StoreNewPassword() );
098
099        // --------------------------------------------------------------------------------------------
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}