Frames | No Frames |
1: /* Entry.java -- 2: Copyright (C) 2003, 2006, 2010 Free Software Foundation, Inc. 3: 4: This file is a 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 of the License, or (at 9: your option) 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; if not, write to the Free Software 18: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 19: 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: 39: package gnu.javax.crypto.keyring; 40: 41: import gnu.java.security.Configuration; 42: 43: import java.io.DataInputStream; 44: import java.io.DataOutputStream; 45: import java.io.IOException; 46: import java.util.logging.Logger; 47: 48: /** 49: * An immutable class representing a single entry in a keyring. 50: */ 51: public abstract class Entry 52: { 53: private static final Logger log = Configuration.DEBUG ? 54: Logger.getLogger(Entry.class.getName()) : null; 55: private static final String[] TYPES = new String[] { 56: "Encrypted", 57: "PasswordEncrypted", 58: "Authenticated", 59: "PasswordAuthenticated", 60: "Compressed", 61: "Certificate", 62: "PublicKey", 63: "PrivateKey", 64: "CertPath", 65: "BinaryData" }; 66: /** This entry's type identifier. */ 67: protected int type; 68: /** This entry's property set. */ 69: protected Properties properties; 70: /** This entry's payload. */ 71: protected byte[] payload; 72: 73: /** 74: * Creates a new Entry. 75: * 76: * @param type This entry's type. 77: * @param properties This entry's properties. 78: * @throws IllegalArgumentException If the properties argument is null, or if 79: * the type is out of range. 80: */ 81: protected Entry(int type, Properties properties) 82: { 83: if (type < 0 || type > 255) 84: throw new IllegalArgumentException("invalid packet type"); 85: if (properties == null) 86: throw new IllegalArgumentException("no properties"); 87: this.type = type; 88: this.properties = (Properties) properties.clone(); 89: } 90: 91: /** 92: * Constructor for use by subclasses. 93: */ 94: protected Entry(final int type) 95: { 96: if (type < 0 || type > 255) 97: throw new IllegalArgumentException("invalid packet type"); 98: this.type = type; 99: properties = new Properties(); 100: } 101: 102: /** 103: * Returns this entry's properties object. The properties are cloned before 104: * being returned. 105: * 106: * @return The properties. 107: */ 108: public Properties getProperties() 109: { 110: return (Properties) properties.clone(); 111: } 112: 113: /** 114: * Returns this entry's payload data, or null if 115: */ 116: public byte[] getPayload() 117: { 118: if (payload == null) 119: return null; 120: return (byte[]) payload.clone(); 121: } 122: 123: /** 124: * This method is called when this entry needs to be written to an output 125: * stream. 126: * 127: * @param out The stream to write to. 128: * @throws IOException If an I/O exception occurs. 129: */ 130: public void encode(DataOutputStream out) throws IOException 131: { 132: if (payload == null) 133: encodePayload(); 134: if (out == null) 135: return; 136: out.write(type); 137: properties.encode(out); 138: out.writeInt(payload.length); 139: out.write(payload); 140: } 141: 142: public String toString() 143: { 144: return new StringBuilder("Entry{") 145: .append("type=").append(TYPES[type]) 146: .append(", properties=").append(properties) 147: .append(", payload=") 148: .append(payload == null ? "-" : "byte[" + payload.length + "]") 149: .append( "}") 150: .toString(); 151: } 152: 153: /** 154: * Generic decoding method, which simply decodes the properties field 155: * and reads the payload field. 156: * 157: * @param in The input data stream. 158: * @throws IOException If an I/O error occurs. 159: */ 160: protected void defaultDecode(DataInputStream in) throws IOException 161: { 162: properties = new Properties(); 163: properties.decode(in); 164: int len = in.readInt(); 165: if (len < 0) 166: throw new IOException("corrupt length"); 167: if (Configuration.DEBUG) 168: log.fine("About to instantiate new payload byte array for " + this); 169: payload = new byte[len]; 170: in.readFully(payload); 171: } 172: 173: /** 174: * This method is called of subclasses when the payload data needs to be 175: * created. 176: * 177: * @throws IOException If an encoding error occurs. 178: */ 179: protected abstract void encodePayload() throws IOException; 180: }