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 }