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 */
020
021package org.apache.directory.api.ldap.extras.controls.ppolicy_impl;
022
023
024import org.apache.directory.api.asn1.actions.CheckNotNullLength;
025import org.apache.directory.api.asn1.ber.grammar.AbstractGrammar;
026import org.apache.directory.api.asn1.ber.grammar.Grammar;
027import org.apache.directory.api.asn1.ber.grammar.GrammarTransition;
028import org.apache.directory.api.asn1.ber.tlv.UniversalTag;
029
030
031/**
032 * Grammar for decoding PasswordPolicyResponseControl.
033 *
034 * PasswordPolicyResponseValue ::= SEQUENCE {
035 *         warning [0] CHOICE {
036 *         timeBeforeExpiration [0] INTEGER (0 .. maxInt),
037 *         graceAuthNsRemaining [1] INTEGER (0 .. maxInt) } OPTIONAL,
038 *         
039 *      error   [1] ENUMERATED {
040 *          passwordExpired             (0),
041 *          accountLocked               (1),
042 *          changeAfterReset            (2),
043 *          passwordModNotAllowed       (3),
044 *          mustSupplyOldPassword       (4),
045 *          insufficientPasswordQuality (5),
046 *          passwordTooShort            (6),
047 *          passwordTooYoung            (7),
048 *          passwordInHistory           (8) } OPTIONAL }
049 *          
050 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
051 */
052public final class PasswordPolicyGrammar extends AbstractGrammar<PasswordPolicyContainer>
053{
054    /** PasswordPolicyResponseControlGrammar singleton instance */
055    private static final PasswordPolicyGrammar INSTANCE = new PasswordPolicyGrammar();
056
057
058    @SuppressWarnings("unchecked")
059    private PasswordPolicyGrammar()
060    {
061        setName( PasswordPolicyGrammar.class.getName() );
062
063        super.transitions = new GrammarTransition[PasswordPolicyStates.END_STATE.ordinal()][256];
064
065        // PasswordPolicyResponseValue ::= SEQUENCE {
066        // ...
067        super.transitions[PasswordPolicyStates.START_STATE.ordinal()][UniversalTag.SEQUENCE.getValue()] = new GrammarTransition<PasswordPolicyContainer>(
068            PasswordPolicyStates.START_STATE, PasswordPolicyStates.PPOLICY_SEQ_STATE,
069            UniversalTag.SEQUENCE.getValue(),
070            new PPolicyInit() );
071
072        // PasswordPolicyResponseValue ::= SEQUENCE {
073        //              warning [0] CHOICE {
074        super.transitions[PasswordPolicyStates.PPOLICY_SEQ_STATE.ordinal()][PasswordPolicyTags.PPOLICY_WARNING_TAG
075            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
076            PasswordPolicyStates.PPOLICY_SEQ_STATE, PasswordPolicyStates.PPOLICY_WARNING_TAG_STATE,
077            PasswordPolicyTags.PPOLICY_WARNING_TAG.getValue(),
078            new CheckNotNullLength<PasswordPolicyContainer>() );
079
080        // PasswordPolicyResponseValue ::= SEQUENCE {
081        //              ...
082        //              error   [1] ENUMERATED {
083        super.transitions[PasswordPolicyStates.PPOLICY_SEQ_STATE.ordinal()][PasswordPolicyTags.PPOLICY_ERROR_TAG
084            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
085            PasswordPolicyStates.PPOLICY_SEQ_STATE, PasswordPolicyStates.PPOLICY_ERROR_TAG_STATE,
086            PasswordPolicyTags.PPOLICY_ERROR_TAG.getValue(),
087            new StoreError<PasswordPolicyContainer>() );
088
089        // PasswordPolicyResponseValue ::= SEQUENCE {
090        //              warning [0] CHOICE {
091        //                      timeBeforeExpiration [0] INTEGER (0 .. maxInt),
092        super.transitions[PasswordPolicyStates.PPOLICY_WARNING_TAG_STATE.ordinal()][PasswordPolicyTags.TIME_BEFORE_EXPIRATION_TAG
093            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
094            PasswordPolicyStates.PPOLICY_WARNING_TAG_STATE, PasswordPolicyStates.PPOLICY_TIME_BEFORE_EXPIRATION_STATE,
095            PasswordPolicyTags.TIME_BEFORE_EXPIRATION_TAG.getValue(),
096            new StoreTimeBeforeExpiration() );
097
098        // PasswordPolicyResponseValue ::= SEQUENCE {
099        //              warning [0] CHOICE {
100        //                      ...
101        //                      graceAuthNsRemaining [1] INTEGER (0 .. maxInt) } OPTIONAL,
102        super.transitions[PasswordPolicyStates.PPOLICY_WARNING_TAG_STATE.ordinal()][PasswordPolicyTags.GRACE_AUTHNS_REMAINING_TAG
103            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
104            PasswordPolicyStates.PPOLICY_WARNING_TAG_STATE, PasswordPolicyStates.PPOLICY_GRACE_AUTHNS_REMAINING_STATE,
105            PasswordPolicyTags.GRACE_AUTHNS_REMAINING_TAG.getValue(),
106            new StoreGraceAuthNRemaining() );
107
108        // PasswordPolicyResponseValue ::= SEQUENCE {
109        //              ...
110        //              error   [1] ENUMERATED {
111        super.transitions[PasswordPolicyStates.PPOLICY_TIME_BEFORE_EXPIRATION_STATE.ordinal()][PasswordPolicyTags.PPOLICY_ERROR_TAG
112            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
113            PasswordPolicyStates.PPOLICY_TIME_BEFORE_EXPIRATION_STATE, PasswordPolicyStates.PPOLICY_ERROR_TAG_STATE,
114            PasswordPolicyTags.PPOLICY_ERROR_TAG.getValue(),
115            new StoreError<PasswordPolicyContainer>() );
116
117        // PasswordPolicyResponseValue ::= SEQUENCE {
118        //              ...
119        //              error   [1] ENUMERATED {
120        super.transitions[PasswordPolicyStates.PPOLICY_GRACE_AUTHNS_REMAINING_STATE.ordinal()][PasswordPolicyTags.GRACE_AUTHNS_REMAINING_TAG
121            .getValue()] = new GrammarTransition<PasswordPolicyContainer>(
122            PasswordPolicyStates.PPOLICY_GRACE_AUTHNS_REMAINING_STATE, PasswordPolicyStates.PPOLICY_ERROR_TAG_STATE,
123            PasswordPolicyTags.GRACE_AUTHNS_REMAINING_TAG.getValue(),
124            new StoreError<PasswordPolicyContainer>() );
125    }
126
127
128    /**
129     * @return the singleton instance of the PasswordPolicyGrammar
130     */
131    public static Grammar<PasswordPolicyContainer> getInstance()
132    {
133        return INSTANCE;
134    }
135}