Frames | No Frames |
1: /* ObjectId.java -- Simple object identification mechanism for XML encoding. 2: Copyright (C) 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: 39: package gnu.java.beans.encoder; 40: 41: import java.util.HashMap; 42: 43: /** 44: * <p> 45: * ObjectId provides an object identification mechanism which gives each object 46: * a name in the form <code><class><Nameindex></code>. 47: * </p> 48: * 49: * <p> 50: * Each id can be in an unused state which means that only one instance of the 51: * object is in use and a special id is not needed. Certain {@link 52: * gnu.java.beans.encoder.elements.Element} subclasses use this feature to find 53: * out whether they write the "id" attribute or not. 54: * </p> 55: * <p> 56: * An <code>ObjectId</code> instance is typically given to multiple objects. 57: * The second user should then invoke the {@link #init} method to generate the 58: * identification string and bring the id in the 'used' state. 59: * </p> 60: * 61: * @author Robert Schuster (robertschuster@fsfe.org) 62: */ 63: public class ObjectId 64: { 65: /** 66: * Stores the index an object of a specific type should be given. 67: */ 68: private static HashMap nameIndices = new HashMap(); 69: 70: private String id; 71: 72: private Class klass; 73: 74: ObjectId(Class klass) 75: { 76: this.klass = klass; 77: } 78: 79: public boolean isUnused() 80: { 81: return id == null; 82: } 83: 84: public String toString() 85: { 86: return (id != null) ? id : "<unused id>"; 87: } 88: 89: /** 90: * <p> 91: * Generates a simple Id by concatenating a class name with a self-increasing 92: * number. 93: * </p> 94: */ 95: public void init() 96: { 97: assert (klass != null); 98: 99: if (id != null) 100: return; 101: 102: Integer count = (Integer) nameIndices.get(klass); 103: if (count == null) 104: { 105: count = Integer.valueOf(0); 106: } 107: 108: if (klass.isArray()) 109: { 110: Class ct = klass.getComponentType(); 111: if (ct == Boolean.TYPE) 112: id = "booleanArray" + count.intValue(); 113: else if (ct == Byte.TYPE) 114: id = "byteArray" + count.intValue(); 115: else if (ct == Short.TYPE) 116: id = "shortArray" + count.intValue(); 117: else if (ct == Integer.TYPE) 118: id = "intArray" + count.intValue(); 119: else if (ct == Long.TYPE) 120: id = "longArray" + count.intValue(); 121: else if (ct == Float.TYPE) 122: id = "floatArray" + count.intValue(); 123: else if (ct == Double.TYPE) 124: id = "doubleArray" + count.intValue(); 125: } 126: else 127: id = klass.getName() + count.intValue(); 128: 129: nameIndices.put(klass, Integer.valueOf(count.intValue() + 1)); 130: } 131: 132: }