You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/02/09 04:13:39 UTC

directory-kerberos git commit: DIRKRB-158. Decouple the mixed aspects in EncodingOption in kerby-asn1

Repository: directory-kerberos
Updated Branches:
  refs/heads/master 44a42d10d -> 57e75f088


DIRKRB-158. Decouple the mixed aspects in EncodingOption in kerby-asn1


Project: http://git-wip-us.apache.org/repos/asf/directory-kerberos/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerberos/commit/57e75f08
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerberos/tree/57e75f08
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerberos/diff/57e75f08

Branch: refs/heads/master
Commit: 57e75f088d489b37f8480924cbb83d58ccdc24a4
Parents: 44a42d1
Author: Drankye <dr...@gmail.com>
Authored: Mon Feb 9 11:13:08 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Mon Feb 9 11:13:08 2015 +0800

----------------------------------------------------------------------
 .../org/apache/kerby/asn1/EncodingOption.java   | 185 ++++++++++++-------
 .../kerby/asn1/type/AbstractAsn1Type.java       |  42 +++--
 .../org/apache/kerby/asn1/type/Asn1Choice.java  |   2 +-
 .../apache/kerby/asn1/type/Asn1Collection.java  |   2 +-
 .../kerby/asn1/type/Asn1CollectionType.java     |   2 +-
 .../org/apache/kerby/asn1/type/Asn1Simple.java  |   3 +-
 .../org/apache/kerby/asn1/type/Asn1Tagging.java |  11 +-
 .../kerby/asn1/type/TaggingCollection.java      |   8 +-
 .../org/apache/kerby/asn1/PersonnelRecord.java  |  10 +-
 .../org/apache/kerby/asn1/TestAsn1Boolean.java  |  14 +-
 .../org/apache/kerby/asn1/TestAsn1Integer.java  |   4 +-
 .../kerby/asn1/TestAsn1ObjectIdentifier.java    |   4 +-
 .../org/apache/kerby/asn1/TestAsn1UtcTime.java  |   4 +-
 .../apache/kerby/asn1/TestTaggingEncoding.java  |  25 ++-
 .../kerby/kerberos/kerb/codec/KrbCodec.java     |   4 +-
 15 files changed, 204 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/EncodingOption.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/EncodingOption.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/EncodingOption.java
index bac3d19..0308065 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/EncodingOption.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/EncodingOption.java
@@ -21,20 +21,32 @@ package org.apache.kerby.asn1;
 
 /**
  * An enum used to represent the various Encoding options.
- * 
+ *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public enum EncodingOption {
-    UNKNOWN(-1),
-    PRIMITIVE(1),
-    CONSTRUCTED(2),
-    CONSTRUCTED_DEFLEN(3),
-    CONSTRUCTED_INDEFLEN(4),
-    IMPLICIT(5),
-    EXPLICIT(6),
-    BER(7),
-    DER(8),
-    CER(9);
+public class EncodingOption {
+    /**
+     * Encoding type
+     */
+    protected static enum EncodingType {
+        BER,
+        DER,
+        CER;
+    }
+
+    private EncodingType encodingType;
+    private boolean isPrimitive;
+    private boolean isDefLen;
+    private boolean isImplicit;
+
+    /**
+     * The default constructor with default values.
+     */
+    public EncodingOption() {
+        this.encodingType = EncodingType.BER;
+        this.isPrimitive = true;
+        this.isImplicit = true;
+    }
 
     /** 
      * A mask to determinate if a Tag is CONSTRUCTED. The fifth bit should be set to 1 if
@@ -42,24 +54,15 @@ public enum EncodingOption {
      */
     public static int CONSTRUCTED_FLAG = 0x20;
 
-    /** The associated value */
-    private int value;
-
-    /** Create a instance of EncodingOption */
-    private EncodingOption(int value) {
-        this.value = value;
+    public static boolean isConstructed(int tag) {
+        return (tag & CONSTRUCTED_FLAG) != 0;
     }
 
-
     /**
-     * @return The integer value associated with the EncodingOption instance
+     * Use primitive.
      */
-    public int getValue() {
-        return value;
-    }
-
-    public static boolean isConstructed(int tag) {
-        return (tag & CONSTRUCTED_FLAG) != 0;
+    public void usePrimitive() {
+        this.isPrimitive = true;
     }
 
     /**
@@ -68,82 +71,132 @@ public enum EncodingOption {
      * @return true if using PRIMITIVE, false otherwise
      */
     public boolean isPrimitive() {
-        return this == PRIMITIVE;
+        return this.isPrimitive;
     }
 
     /**
-     * Tells if the EncodingOption is for an encoded type (CONSTRUCTED, CONSTRUCTED_DEFLEN
-     * or CONSTRUCTED_INDEFLEN)
+     * Use constructed.
+     */
+    public void useConstructed() {
+        this.isPrimitive = false;
+        useNonDefLen();
+    }
+
+    /**
+     * Tells if it's constructed (not primitive).
      * 
-     * @return true if the EncodingOption is CONSTRUCTED, false otherwise
+     * @return true if it's constructed, false otherwise
      */
     public boolean isConstructed() {
-        return this == CONSTRUCTED || this == CONSTRUCTED_DEFLEN || this == CONSTRUCTED_INDEFLEN;
+        return ! isPrimitive;
+    }
+
+    /**
+     * Use definitive length, only makes sense when it's constructed.
+     */
+    public void useDefLen() {
+        if (isPrimitive()) {
+            throw new IllegalArgumentException("It's only for constructed");
+        }
+        this.isDefLen = true;
+    }
+
+    /**
+     * Use non-definitive length, only makes sense when it's constructed.
+     */
+    public void useNonDefLen() {
+        if (isPrimitive()) {
+            throw new IllegalArgumentException("It's only for constructed");
+        }
+        this.isDefLen = false;
     }
 
     /**
-     * Tells if the EncodingOption is IMPLICIT
+     * Tells if it's definitive length or not.
+     * @return
+     */
+    public boolean isDefLen() {
+        return this.isDefLen;
+    }
+
+    /**
+     * Use implicit, which will discard the value set by useExplicit.
+     */
+    public void useImplicit() {
+        this.isImplicit = true;
+    }
+
+    /**
+     * Tells if it's is IMPLICIT
      * 
      * @return true if using IMPLICIT, false otherwise
      */
     public boolean isImplicit() {
-        return this == IMPLICIT;
+        return isImplicit;
+    }
+
+    /**
+     * Use explicit, which will discard the value set by useImplicit.
+     */
+    public void useExplicit() {
+        this.isImplicit = false;
     }
 
     /**
-     * Tells if the EncodingOption is EXPLICIT
+     * Tells if it's is EXPLICIT
      * 
      * @return true if using EXPLICIT, false otherwise
      */
     public boolean isExplicit() {
-        return this == EXPLICIT;
+        return ! isImplicit;
+    }
+
+    /**
+     * Set encoding type as DER.
+     */
+    public void useDer() {
+        this.encodingType = EncodingType.DER;
     }
 
     /**
-     * Tells if the EncodingOption is DER
+     * Tells if it's is DER
      * 
      * @return true if using DER, false otherwise
      */
     public boolean isDer() {
-        return this == DER;
+        return encodingType == EncodingType.DER;
     }
 
     /**
-     * Tells if the EncodingOption is CER
-     * 
-     * @return true if using CER, false otherwise
+     * Set encoding type as BER.
      */
-    public boolean isCer() {
-        return this == CER;
+    public void useBer() {
+        this.encodingType = EncodingType.BER;
     }
 
     /**
-     * Tells if the EncodingOption is BER
-     * 
+     * Tells if it's is BER
+     *
      * @return true if using BER, false otherwise
      */
     public boolean isBer() {
-        return this == BER;
-    }
-
-    
-    /**
-     * Get the EncodingOption given an integer value
-     * @param value The value to translate
-     * @return The associated EncodingOption
-     */
-    public static EncodingOption fromValue(int value) {
-        switch (value) {
-            case 1 : return PRIMITIVE;
-            case 2 : return CONSTRUCTED;
-            case 3 : return CONSTRUCTED_DEFLEN;
-            case 4 : return CONSTRUCTED_INDEFLEN;
-            case 5 : return IMPLICIT;
-            case 6 : return EXPLICIT;
-            case 7 : return BER;
-            case 8 : return DER;
-            case 9 : return CER;
-            default : return UNKNOWN;
-        }
+        return encodingType == EncodingType.BER;
+    }
+
+    /**
+     * Set encoding type as CER.
+     */
+    public void useCer() {
+        this.encodingType = EncodingType.CER;
     }
+
+    /**
+     * Tells if it's is CER
+     * 
+     * @return true if using CER, false otherwise
+     */
+    public boolean isCer() {
+        return encodingType == EncodingType.CER;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
index a00591d..bf0ec9b 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
@@ -38,7 +38,7 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
     private TagClass tagClass = TagClass.UNKNOWN;
     private int tagNo = -1;
     private int tagFlags = -1;
-    private EncodingOption encodingOption = EncodingOption.BER;
+    private EncodingOption encodingOption = new EncodingOption();
     private int encodingLen = -1;
     // The wrapped real value.
     private T value;
@@ -214,12 +214,16 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
         decode(tag, tagNo, new LimitedByteBuffer(content, length));
     }
 
-    public void decode(int tagFlags, int tagNo, LimitedByteBuffer content) throws IOException {
-        if (this.tagClass != TagClass.UNKNOWN && this.tagClass != TagClass.fromTagFlags(tagFlags)) {
-            throw new IOException("Unexpected tagFlags " + tagFlags + ", expecting " + this.tagClass);
+    public void decode(int tagFlags, int tagNo,
+                       LimitedByteBuffer content) throws IOException {
+        if (this.tagClass != TagClass.UNKNOWN && this.tagClass !=
+                TagClass.fromTagFlags(tagFlags)) {
+            throw new IOException("Unexpected tagFlags " + tagFlags +
+                    ", expecting " + this.tagClass);
         }
         if (this.tagNo != -1 && this.tagNo != tagNo) {
-            throw new IOException("Unexpected tagNo " + tagNo + ", expecting " + this.tagNo);
+            throw new IOException("Unexpected tagNo " + tagNo + ", " +
+                    "expecting " + this.tagNo);
         }
 
         this.tagClass = TagClass.fromTagFlags(tagFlags);
@@ -233,8 +237,10 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
 
     protected int taggedEncodingLength(TaggingOption taggingOption) {
         int taggingTagNo = taggingOption.getTagNo();
-        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength() : encodingLength();
-        int taggingEncodingLen = lengthOfTagLength(taggingTagNo) + lengthOfBodyLength(taggingBodyLen) + taggingBodyLen;
+        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength() :
+                encodingLength();
+        int taggingEncodingLen = lengthOfTagLength(taggingTagNo) +
+                lengthOfBodyLength(taggingBodyLen) + taggingBodyLen;
         return taggingEncodingLen;
     }
 
@@ -249,7 +255,8 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
     public void taggedEncode(ByteBuffer buffer, TaggingOption taggingOption) {
         int taggingTagFlags = taggingOption.tagFlags(isConstructed());
         encodeTag(buffer, taggingTagFlags, taggingOption.getTagNo());
-        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength() : encodingLength();
+        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength() :
+                encodingLength();
         encodeLength(buffer, taggingBodyLen);
         if (taggingOption.isImplicit()) {
             encodeBody(buffer);
@@ -258,17 +265,20 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
         }
     }
 
-    public void taggedDecode(byte[] content, TaggingOption taggingOption) throws IOException {
+    public void taggedDecode(byte[] content,
+                             TaggingOption taggingOption) throws IOException {
         taggedDecode(ByteBuffer.wrap(content), taggingOption);
     }
 
     @Override
-    public void taggedDecode(ByteBuffer content, TaggingOption taggingOption) throws IOException {
+    public void taggedDecode(ByteBuffer content,
+                             TaggingOption taggingOption) throws IOException {
         LimitedByteBuffer limitedBuffer = new LimitedByteBuffer(content);
         taggedDecode(limitedBuffer, taggingOption);
     }
 
-    protected void taggedDecode(LimitedByteBuffer content, TaggingOption taggingOption) throws IOException {
+    protected void taggedDecode(LimitedByteBuffer content,
+                                TaggingOption taggingOption) throws IOException {
         int taggingTag = readTag(content);
         int taggingTagNo = readTagNo(content, taggingTag);
         int taggingLength = readLength(content);
@@ -278,13 +288,17 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
         taggedDecode(tagFlags, taggingTagNo, newContent, taggingOption);
     }
 
-    protected void taggedDecode(int taggingTagFlags, int taggingTagNo, LimitedByteBuffer content, TaggingOption taggingOption) throws IOException {
+    protected void taggedDecode(int taggingTagFlags, int taggingTagNo,
+                                LimitedByteBuffer content,
+                                TaggingOption taggingOption) throws IOException {
         int expectedTaggingTagFlags = taggingOption.tagFlags(isConstructed());
         if (expectedTaggingTagFlags != taggingTagFlags) {
-            throw new IOException("Unexpected tag flags" + taggingTagFlags + ", expecting " + expectedTaggingTagFlags);
+            throw new IOException("Unexpected tag flags " + taggingTagFlags +
+                    ", expecting " + expectedTaggingTagFlags);
         }
         if (taggingOption.getTagNo() != taggingTagNo) {
-            throw new IOException("Unexpected tagNo " + taggingTagNo + ", expecting " + taggingOption.getTagNo());
+            throw new IOException("Unexpected tagNo " + taggingTagNo + ", " +
+                    "expecting " + taggingOption.getTagNo());
         }
 
         if (taggingOption.isImplicit()) {

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
index 69b1fd6..7c65e7c 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
@@ -34,7 +34,7 @@ public class Asn1Choice extends AbstractAsn1Type<Asn1Type> {
         setValue(this);
         this.fieldInfos = fieldInfos;
         this.fields = new Asn1Type[fieldInfos.length];
-        setEncodingOption(EncodingOption.CONSTRUCTED);
+        getEncodingOption().useConstructed();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Collection.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Collection.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Collection.java
index 5ea02f1..796092e 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Collection.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Collection.java
@@ -36,7 +36,7 @@ public class Asn1Collection extends AbstractAsn1Type<List<Asn1Item>> {
     public Asn1Collection(TagClass tagClass, int tagNo) {
         super(tagClass, tagNo);
         setValue(new ArrayList<Asn1Item>());
-        setEncodingOption(EncodingOption.CONSTRUCTED);
+        getEncodingOption().useConstructed();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
index 4187209..bb42988 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
@@ -39,7 +39,7 @@ public abstract class Asn1CollectionType extends AbstractAsn1Type<Asn1Collection
         setValue(this);
         this.fieldInfos = fieldInfos;
         this.fields = new Asn1Type[fieldInfos.length];
-        setEncodingOption(EncodingOption.CONSTRUCTED);
+        getEncodingOption().useConstructed();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Simple.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Simple.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Simple.java
index 6c4352c..66c542b 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Simple.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Simple.java
@@ -19,7 +19,6 @@
  */
 package org.apache.kerby.asn1.type;
 
-import org.apache.kerby.asn1.EncodingOption;
 import org.apache.kerby.asn1.LimitedByteBuffer;
 import org.apache.kerby.asn1.TagClass;
 import org.apache.kerby.asn1.UniversalTag;
@@ -49,7 +48,7 @@ public abstract class Asn1Simple<T> extends AbstractAsn1Type<T> {
      */
     public Asn1Simple(UniversalTag tagNo, T value) {
         super(TagClass.UNIVERSAL, tagNo.getValue(), value);
-        setEncodingOption(EncodingOption.PRIMITIVE);
+        getEncodingOption().usePrimitive();
     }
 
     protected byte[] getBytes() {

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Tagging.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Tagging.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Tagging.java
index b1e919c..89fccaa 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Tagging.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Tagging.java
@@ -38,7 +38,7 @@ public class Asn1Tagging<T extends Asn1Type> extends AbstractAsn1Type<T> {
 
     public Asn1Tagging(int tagNo, T value, boolean isAppSpecific) {
         super(isAppSpecific ? TagClass.APPLICATION : TagClass.CONTEXT_SPECIFIC, tagNo, value);
-        setEncodingOption(EncodingOption.EXPLICIT);
+        getEncodingOption().useExplicit();
         if (value == null) {
             initValue();
         }
@@ -52,7 +52,8 @@ public class Asn1Tagging<T extends Asn1Type> extends AbstractAsn1Type<T> {
         } else if (getEncodingOption().isImplicit()) {
             return value.encodingBodyLength();
         } else {
-            throw new RuntimeException("Invalid util option, only allowing explicit/implicit");
+            throw new RuntimeException("Invalid decoding option, " +
+                    "only allowing explicit/implicit");
         }
     }
 
@@ -75,7 +76,8 @@ public class Asn1Tagging<T extends Asn1Type> extends AbstractAsn1Type<T> {
         } else if (getEncodingOption().isImplicit()) {
             value.encodeBody(buffer);
         } else {
-            throw new RuntimeException("Invalid util option, only allowing explicit/implicit");
+            throw new RuntimeException("Invalid decoding option, " +
+                    "only allowing explicit/implicit");
         }
     }
 
@@ -87,7 +89,8 @@ public class Asn1Tagging<T extends Asn1Type> extends AbstractAsn1Type<T> {
         } else if (getEncodingOption().isImplicit()) {
             value.decodeBody(content);
         } else {
-            throw new RuntimeException("Invalid util option, only allowing explicit/implicit");
+            throw new RuntimeException("Invalid decoding option, " +
+                    "only allowing explicit/implicit");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
index 48a815c..d316b7b 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
@@ -38,16 +38,22 @@ public abstract class TaggingCollection extends AbstractAsn1Type<Asn1CollectionT
         this.tagged = createTaggedCollection(tags);
         setValue(tagged);
         this.tagging = new Asn1Tagging<Asn1CollectionType>(taggingTagNo, tagged, isAppSpecific);
-        setEncodingOption(EncodingOption.EXPLICIT);
+        getEncodingOption().useExplicit();
     }
 
     protected abstract Asn1CollectionType createTaggedCollection(Asn1FieldInfo[] tags);
 
+    @Override
     public void setEncodingOption(EncodingOption encodingOption) {
         tagging.setEncodingOption(encodingOption);
     }
 
     @Override
+    public EncodingOption getEncodingOption() {
+        return tagging.getEncodingOption();
+    }
+
+    @Override
     public boolean isConstructed() {
         return tagging.isConstructed();
     }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
index 20e4f5c..6c6fc04 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
@@ -44,7 +44,7 @@ public class PersonnelRecord extends TaggingSet {
 
     public PersonnelRecord() {
         super(0, fieldInfos, true);
-        setEncodingOption(EncodingOption.IMPLICIT);
+        getEncodingOption().useImplicit();
     }
 
     public void setName(Name name) {
@@ -151,7 +151,7 @@ public class PersonnelRecord extends TaggingSet {
 
         public Name() {
             super(1, tags, true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
 
         public Name(String givenName, String initial, String familyName) {
@@ -189,19 +189,19 @@ public class PersonnelRecord extends TaggingSet {
     public static class EmployeeNumber extends Asn1Tagging<Asn1Integer> {
         public EmployeeNumber(Integer value) {
             super(2, new Asn1Integer(value), true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
 
         public EmployeeNumber() {
             super(2, new Asn1Integer(), true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
     }
 
     public static class Date extends Asn1Tagging<Asn1VisibleString> {
         public Date(String value) {
             super(3, new Asn1VisibleString(value), true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
         public Date() {
             this(null);

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Boolean.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Boolean.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Boolean.java
index 691c8fe..947f30f 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Boolean.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Boolean.java
@@ -38,8 +38,11 @@ public class TestAsn1Boolean {
                                   boolean isDer) {
         byte[] expected = Util.hex2bytes(expectedEncoding);
         Asn1Boolean aValue = new Asn1Boolean(value);
-        aValue.setEncodingOption(isDer ? EncodingOption.DER :
-                EncodingOption.BER);
+        if (isDer) {
+            aValue.getEncodingOption().useDer();
+        } else {
+            aValue.getEncodingOption().useBer();
+        }
         byte[] encodingBytes = aValue.encode();
         assertThat(encodingBytes).isEqualTo(expected);
     }
@@ -55,8 +58,11 @@ public class TestAsn1Boolean {
     private void testDecodingWith(Boolean expectedValue, String content,
                                   boolean isDer) throws IOException {
         Asn1Boolean decoded = new Asn1Boolean();
-        decoded.setEncodingOption(isDer ? EncodingOption.DER :
-                EncodingOption.BER);
+        if (isDer) {
+            decoded.getEncodingOption().useDer();
+        } else {
+            decoded.getEncodingOption().useBer();
+        }
         decoded.decode(Util.hex2bytes(content));
         assertThat(decoded.getValue()).isEqualTo(expectedValue);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Integer.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Integer.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Integer.java
index 29df679..f9a774e 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Integer.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1Integer.java
@@ -44,7 +44,7 @@ public class TestAsn1Integer {
     private void testEncodingWith(int value, String expectedEncoding) {
         byte[] expected = Util.hex2bytes(expectedEncoding);
         Asn1Integer aValue = new Asn1Integer(value);
-        aValue.setEncodingOption(EncodingOption.DER);
+        aValue.getEncodingOption().useDer();
         byte[] encodingBytes = aValue.encode();
         assertThat(encodingBytes).isEqualTo(expected);
     }
@@ -64,7 +64,7 @@ public class TestAsn1Integer {
 
     private void testDecodingWith(int expectedValue, String content) throws IOException {
         Asn1Integer decoded = new Asn1Integer();
-        decoded.setEncodingOption(EncodingOption.DER);
+        decoded.getEncodingOption().useDer();
         decoded.decode(Util.hex2bytes(content));
         assertThat(decoded.getValue().intValue()).isEqualTo(expectedValue);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1ObjectIdentifier.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1ObjectIdentifier.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1ObjectIdentifier.java
index 4299eab..cb97922 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1ObjectIdentifier.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1ObjectIdentifier.java
@@ -45,7 +45,7 @@ public class TestAsn1ObjectIdentifier {
     private void testEncodingWith(String oid, String expectedEncoding) {
         byte[] expected = Util.hex2bytes(expectedEncoding);
         Asn1ObjectIdentifier aValue = new Asn1ObjectIdentifier(oid);
-        aValue.setEncodingOption(EncodingOption.DER);
+        aValue.getEncodingOption().useDer();
         byte[] encodingBytes = aValue.encode();
         assertThat(encodingBytes).isEqualTo(expected);
     }
@@ -58,7 +58,7 @@ public class TestAsn1ObjectIdentifier {
 
     private void testDecodingWith(String expectedValue, String content) throws IOException {
         Asn1ObjectIdentifier decoded = new Asn1ObjectIdentifier();
-        decoded.setEncodingOption(EncodingOption.DER);
+        decoded.getEncodingOption().useDer();
         decoded.decode(Util.hex2bytes(content));
         assertThat(decoded.getValue()).isEqualTo(expectedValue);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1UtcTime.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1UtcTime.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1UtcTime.java
index 20e5c30..6d4d2a2 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1UtcTime.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestAsn1UtcTime.java
@@ -48,7 +48,7 @@ public class TestAsn1UtcTime {
     private void testEncodingWith(Date value, String expectedEncoding) {
         byte[] expected = Util.hex2bytes(expectedEncoding);
         Asn1UtcTime aValue = new Asn1UtcTime(value);
-        aValue.setEncodingOption(EncodingOption.DER);
+        aValue.getEncodingOption().useDer();
         byte[] encodingBytes = aValue.encode();
         assertThat(encodingBytes).isEqualTo(expected);
     }
@@ -64,7 +64,7 @@ public class TestAsn1UtcTime {
 
     private void testDecodingWith(Date expectedValue, String content) throws IOException {
         Asn1UtcTime decoded = new Asn1UtcTime();
-        decoded.setEncodingOption(EncodingOption.DER);
+        decoded.getEncodingOption().useDer();
         decoded.decode(Util.hex2bytes(content));
         assertThat(decoded.getValue()).isEqualTo(expectedValue);
     }

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestTaggingEncoding.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestTaggingEncoding.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestTaggingEncoding.java
index a6ada58..c836217 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestTaggingEncoding.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/TestTaggingEncoding.java
@@ -62,11 +62,18 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 public class TestTaggingEncoding {
     static final String TEST_STRING = "Jones";
-    static byte[] TYPE1_EXPECTED_BYTES = new byte[] {(byte) 0x1A, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
-    static byte[] TYPE2_EXPECTED_BYTES = new byte[] {(byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
-    static byte[] TYPE3_EXPECTED_BYTES = new byte[] {(byte) 0xA2, (byte) 0x07, (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
-    static byte[] TYPE4_EXPECTED_BYTES = new byte[] {(byte) 0x67, (byte) 0x07, (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
-    static byte[] TYPE5_EXPECTED_BYTES = new byte[] {(byte) 0x82, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
+    static byte[] TYPE1_EXPECTED_BYTES = new byte[] {(byte) 0x1A, (byte) 0x05,
+            (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
+    static byte[] TYPE2_EXPECTED_BYTES = new byte[] {(byte) 0x43, (byte) 0x05,
+            (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
+    static byte[] TYPE3_EXPECTED_BYTES = new byte[] {(byte) 0xA2, (byte) 0x07,
+            (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E,
+            (byte) 0x65, (byte) 0x73};
+    static byte[] TYPE4_EXPECTED_BYTES = new byte[] {(byte) 0x67, (byte) 0x07,
+            (byte) 0x43, (byte) 0x05, (byte) 0x4A, (byte) 0x6F, (byte) 0x6E,
+            (byte) 0x65, (byte) 0x73};
+    static byte[] TYPE5_EXPECTED_BYTES = new byte[] {(byte) 0x82, (byte) 0x05,
+            (byte) 0x4A, (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x73};
 
 
     public static class Type1 extends Asn1VisibleString {
@@ -81,7 +88,7 @@ public class TestTaggingEncoding {
     public static class Type2 extends Asn1Tagging<Type1> {
         public Type2(Type1 value) {
             super(3, value, true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
         public Type2() {
             this(null);
@@ -91,7 +98,7 @@ public class TestTaggingEncoding {
     public static class Type3 extends Asn1Tagging<Type2> {
         public Type3(Type2 value) {
             super(2, value, false);
-            setEncodingOption(EncodingOption.EXPLICIT);
+            getEncodingOption().useExplicit();
         }
         public Type3() {
             this(null);
@@ -101,7 +108,7 @@ public class TestTaggingEncoding {
     public static class Type4 extends Asn1Tagging<Type3> {
         public Type4(Type3 value) {
             super(7, value, true);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
         public Type4() {
             this(null);
@@ -111,7 +118,7 @@ public class TestTaggingEncoding {
     public static class Type5 extends Asn1Tagging<Type2> {
         public Type5(Type2 value) {
             super(2, value, false);
-            setEncodingOption(EncodingOption.IMPLICIT);
+            getEncodingOption().useImplicit();
         }
         public Type5() {
             this(null);

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/57e75f08/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/codec/KrbCodec.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/codec/KrbCodec.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/codec/KrbCodec.java
index 8204267..3e26c30 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/codec/KrbCodec.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/codec/KrbCodec.java
@@ -45,7 +45,7 @@ public class KrbCodec {
     }
 
     public static <T extends Asn1Type> T decode(ByteBuffer content, Class<T> krbType) throws KrbException {
-        Asn1Type implObj = null;
+        Asn1Type implObj;
         try {
             implObj = krbType.newInstance();
         } catch (Exception e) {
@@ -68,7 +68,7 @@ public class KrbCodec {
         int length = AbstractAsn1Type.readLength(limitedBuffer);
         LimitedByteBuffer valueBuffer = new LimitedByteBuffer(limitedBuffer, length);
 
-        KrbMessage msg = null;
+        KrbMessage msg;
         KrbMessageType msgType = KrbMessageType.fromValue(tagNo);
         if (msgType == KrbMessageType.TGS_REQ) {
             msg = new TgsReq();