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     * The base class for algorithm names, with optional implementation 
011     * requirement. This class is immutable.
012     *
013     * <p>Includes constants for the following standard algorithm names:
014     *
015     * <ul>
016     *     <li>{@link #NONE none}
017     * </ul>
018     *
019     * @author Vladimir Dzhuvinov 
020     * @version $version$ (2013-03-27)
021     */
022    @Immutable
023    public class Algorithm implements JSONAware {
024    
025    
026            /**
027             * No algorithm (plain JOSE object without signature / encryption).
028             */
029            public static final Algorithm NONE = new Algorithm("none", Requirement.REQUIRED);
030    
031    
032            /**
033             * The algorithm name.
034             */
035            private final String name;
036    
037    
038            /**
039             * The implementation requirement, {@code null} if not known.
040             */
041            private final Requirement requirement;
042    
043    
044            /**
045             * Creates a new JOSE algorithm name.
046             *
047             * @param name The algorithm name. Must not be {@code null}.
048             * @param req  The implementation requirement, {@code null} if not 
049             *             known.
050             */
051            public Algorithm(final String name, final Requirement req) {
052    
053                    if (name == null) {
054    
055                            throw new IllegalArgumentException("The algorithm name must not be null");
056                    }
057    
058                    this.name = name;
059    
060                    requirement = req;
061            }
062    
063    
064            /**
065             * Creates a new JOSE algorithm name.
066             *
067             * @param name The algorithm name. Must not be {@code null}.
068             */
069            public Algorithm(final String name) {
070    
071                    this(name, null);
072            }
073    
074    
075            /**
076             * Gets the name of this algorithm.
077             *
078             * @return The algorithm name.
079             */
080            public final String getName() {
081    
082                    return name;
083            }
084    
085    
086            /**
087             * Gets the implementation requirement of this algorithm.
088             *
089             * @return The implementation requirement, {@code null} if not known.
090             */
091            public final Requirement getRequirement() {
092    
093                    return requirement;
094            }
095    
096    
097            /**
098             * Overrides {@code Object.hashCode()}.
099             *
100             * @return The object hash code.
101             */
102            @Override
103            public final int hashCode() {
104    
105                    return name.hashCode();
106            }
107    
108    
109            /**
110             * Overrides {@code Object.equals()}.
111             *
112             * @param object The object to compare to.
113             *
114             * @return {@code true} if the objects have the same value, otherwise
115             *         {@code false}.
116             */
117            @Override
118            public boolean equals(final Object object) {
119    
120                    return object != null && 
121                           object instanceof Algorithm && 
122                           this.toString().equals(object.toString());
123            }
124    
125    
126            /**
127             * Returns the string representation of this algorithm.
128             *
129             * @see #getName
130             *
131             * @return The string representation.
132             */
133            @Override
134            public final String toString() {
135    
136                    return name;
137            }
138    
139    
140            /**
141             * Returns the JSON string representation of this algorithm.
142             * 
143             * @return The JSON string representation.
144             */
145            @Override
146            public final String toJSONString() {
147    
148                    StringBuilder sb = new StringBuilder();
149                    sb.append('"');
150                    sb.append(JSONObject.escape(name));
151                    sb.append('"');
152                    return sb.toString();
153            }
154    }