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}