001    package com.nimbusds.jose;
002    
003    
004    import net.jcip.annotations.Immutable;
005    import net.minidev.json.JSONAware;
006    import net.minidev.json.JSONObject;
007    
008    
009    /**
010     * Compression algorithm name, represents the {@code zip} header parameter in 
011     * JSON Web Encryption (JWE) objects. This class is immutable.
012     *
013     * <p>Includes a constant for the standard DEFLATE compression algorithm:
014     *
015     * <ul>
016     *     <li>{@link #DEF}
017     * </ul> 
018     *
019     * <p>Additional compression algorithm names can be defined using the 
020     * constructor. 
021     *
022     * @author Vladimir Dzhuvinov
023     * @version $version$ (2013-01-15)
024     */
025    @Immutable
026    public final class CompressionAlgorithm implements JSONAware {
027    
028    
029            /**
030             * DEFLATE Compressed Data Format Specification version 1.3, as 
031             * described in RFC 1951.
032             */
033            public static final CompressionAlgorithm DEF = new CompressionAlgorithm("DEF");
034    
035    
036            /**
037             * The algorithm name.
038             */
039            private final String name;
040    
041    
042            /**
043             * Creates a new compression algorithm with the specified name.
044             *
045             * @param name The compression algorithm name. Must not be {@code null}.
046             */
047            public CompressionAlgorithm(final String name) {
048    
049                    if (name == null) {
050                            throw new IllegalArgumentException("The compression algorithm name must not be null");
051                    }
052    
053                    this.name = name;
054            }
055    
056    
057            /**
058             * Gets the name of this compression algorithm.
059             *
060             * @return The compression algorithm name.
061             */
062            public String getName() {
063    
064                    return name;
065            }
066    
067    
068            /**
069             * Overrides {@code Object.hashCode()}.
070             *
071             * @return The object hash code.
072             */
073            @Override
074            public int hashCode() {
075    
076                    return name.hashCode();
077            }
078    
079    
080            /**
081             * Overrides {@code Object.equals()}.
082             *
083             * @param object The object to compare to.
084             *
085             * @return {@code true} if the objects have the same value, otherwise
086             *         {@code false}.
087             */
088            @Override
089            public boolean equals(final Object object) {
090    
091                    return object != null && 
092                                    object instanceof CompressionAlgorithm && 
093                                    this.toString().equals(object.toString());
094            }
095    
096    
097            /**
098             * Returns the string representation of this compression algorithm.
099             *
100             * @see #getName
101             *
102             * @return The string representation.
103             */
104            @Override
105            public String toString() {
106    
107                    return name;
108            }
109    
110    
111            /**
112             * Returns the JSON string representation of this compression algorithm.
113             * 
114             * @return The JSON string representation.
115             */
116            @Override
117            public String toJSONString() {
118    
119                    StringBuilder sb = new StringBuilder();
120                    sb.append('"');
121                    sb.append(JSONObject.escape(name));
122                    sb.append('"');
123                    return sb.toString();
124            }
125    }