GNU Classpath (0.95) | |
Frames | No Frames |
1: /* CertPath.java -- a sequence of certificates 2: Copyright (C) 2002, 2005 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: package java.security.cert; 39: 40: import java.io.ByteArrayInputStream; 41: import java.io.NotSerializableException; 42: import java.io.ObjectStreamException; 43: import java.io.Serializable; 44: import java.util.Iterator; 45: import java.util.List; 46: 47: /** 48: * This class represents an immutable sequence, or path, of security 49: * certificates. The path type must match the type of each certificate in the 50: * path, or in other words, for all instances of cert in a certpath object, 51: * <code>cert.getType().equals(certpath.getType())</code> will return true. 52: * 53: * <p>Since this class is immutable, it is thread-safe. During serialization, 54: * the path is consolidated into a {@link CertPathRep}, which preserves the 55: * data regardless of the underlying implementation of the path. 56: * 57: * @author Eric Blake (ebb9@email.byu.edu) 58: * @since 1.4 59: * @status updated to 1.4 60: */ 61: public abstract class CertPath implements Serializable 62: { 63: /** 64: * The serialized representation of a path. 65: * 66: * @author Eric Blake (ebb9@email.byu.edu) 67: */ 68: protected static class CertPathRep implements Serializable 69: { 70: /** 71: * Compatible with JDK 1.4+. 72: */ 73: private static final long serialVersionUID = 3015633072427920915L; 74: 75: /** 76: * The certificate type. 77: * 78: * @serial the type of the certificate path 79: */ 80: private final String type; 81: 82: /** 83: * The encoded form of the path. 84: * 85: * @serial the encoded form 86: */ 87: private final byte[] data; 88: 89: /** 90: * Create the new serial representation. 91: * 92: * @param type the path type 93: * @param data the encoded path data 94: */ 95: protected CertPathRep(String type, byte[] data) 96: { 97: this.type = type; 98: this.data = data; 99: } 100: 101: /** 102: * Decode the data into an actual {@link CertPath} upon deserialization. 103: * 104: * @return the replacement object 105: * @throws ObjectStreamException if replacement fails 106: */ 107: protected Object readResolve() throws ObjectStreamException 108: { 109: try 110: { 111: return CertificateFactory.getInstance(type) 112: .generateCertPath(new ByteArrayInputStream(data)); 113: } 114: catch (CertificateException e) 115: { 116: throw (ObjectStreamException) 117: new NotSerializableException("java.security.cert.CertPath: " 118: + type).initCause(e); 119: } 120: } 121: } // class CertPathRep 122: 123: /** 124: * Compatible with JDK 1.4+. 125: */ 126: private static final long serialVersionUID = 6068470306649138683L; 127: 128: /** 129: * The path type. 130: * 131: * @serial the type of all certificates in this path 132: */ 133: private final String type; 134: 135: /** 136: * Create a certificate path with the given type. Most code should use 137: * {@link CertificateFactory} to create CertPaths. 138: * 139: * @param type the type of the path 140: */ 141: protected CertPath(String type) 142: { 143: this.type = type; 144: } 145: 146: /** 147: * Get the (non-null) type of all certificates in the path. 148: * 149: * @return the path certificate type 150: */ 151: public String getType() 152: { 153: return type; 154: } 155: 156: /** 157: * Get an immutable iterator over the path encodings (all String names), 158: * starting with the default encoding. The iterator will throw an 159: * <code>UnsupportedOperationException</code> if an attempt is made to 160: * remove items from the list. 161: * 162: * @return the iterator of supported encodings in the path 163: */ 164: public abstract Iterator<String> getEncodings(); 165: 166: /** 167: * Compares this path to another for semantic equality. To be equal, both 168: * must be instances of CertPath, with the same type, and identical 169: * certificate lists. Overriding classes must not change this behavior. 170: * 171: * @param o the object to compare to 172: * @return true if the two are equal 173: */ 174: public boolean equals(Object o) 175: { 176: if (! (o instanceof CertPath)) 177: return false; 178: CertPath cp = (CertPath) o; 179: return type.equals(cp.type) 180: && getCertificates().equals(cp.getCertificates()); 181: } 182: 183: /** 184: * Returns the hashcode of this certificate path. This is defined as:<br> 185: * <code>31 * getType().hashCode() + getCertificates().hashCode()</code>. 186: * 187: * @return the hashcode 188: */ 189: public int hashCode() 190: { 191: return 31 * type.hashCode() + getCertificates().hashCode(); 192: } 193: 194: public String toString() 195: { 196: List l = getCertificates(); 197: int size = l.size(); 198: int i = 0; 199: StringBuffer result = new StringBuffer(type); 200: result.append(" Cert Path: length = ").append(size).append(".\n[\n"); 201: while (--size >= 0) 202: result.append(l.get(i++)).append('\n'); 203: return result.append("\n]").toString(); 204: } 205: 206: /** 207: * Returns the encoded form of this path, via the default encoding. 208: * 209: * @return the encoded form 210: * @throws CertificateEncodingException if encoding fails 211: */ 212: public abstract byte[] getEncoded() throws CertificateEncodingException; 213: 214: /** 215: * Returns the encoded form of this path, via the specified encoding. 216: * 217: * @param encoding the encoding to use 218: * @return the encoded form 219: * @throws CertificateEncodingException if encoding fails or does not exist 220: */ 221: public abstract byte[] getEncoded(String encoding) 222: throws CertificateEncodingException; 223: 224: /** 225: * Returns the immutable, thread-safe list of certificates in this path. 226: * 227: * @return the list of certificates, non-null but possibly empty 228: */ 229: public abstract List<? extends Certificate> getCertificates(); 230: 231: /** 232: * Serializes the path in its encoded form, to ensure reserialization with 233: * the appropriate factory object without worrying about list implementation. 234: * The result will always be an instance of {@link CertPathRep}. 235: * 236: * @return the replacement object 237: * @throws ObjectStreamException if the replacement creation fails 238: */ 239: protected Object writeReplace() throws ObjectStreamException 240: { 241: try 242: { 243: return new CertPathRep(type, getEncoded()); 244: } 245: catch (CertificateEncodingException e) 246: { 247: throw (ObjectStreamException) 248: new NotSerializableException("java.security.cert.CertPath: " 249: + type).initCause(e); 250: } 251: } 252: } // class CertPath
GNU Classpath (0.95) |