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