Hi,

This is a pretty simple class which just generates new IDs for objects
and reference types. There is no synchronization here since only the
IdManager is supposed to access this class.

Problems/questions/comments?
Keith

ChangeLog
2005-06-14  Keith Seitz  <[EMAIL PROTECTED]>

        * gnu/classpath/jdwp/id/JdwpIdFactory.java: New file.

Index: gnu/classpath/jdwp/id/JdwpIdFactory.java
===================================================================
RCS file: gnu/classpath/jdwp/id/JdwpIdFactory.java
diff -N gnu/classpath/jdwp/id/JdwpIdFactory.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gnu/classpath/jdwp/id/JdwpIdFactory.java	14 Jun 2005 18:22:59 -0000
@@ -0,0 +1,163 @@
+/* JdwpIdFactory.java -- factory for generating type and object IDs
+   Copyright (C) 2005 Free Software Foundation
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.classpath.jdwp.id;
+
+import java.util.HashMap;
+
+/**
+ * This factory generates ids for objects and types that may
+ * be sent to a debugger.
+ *
+ * @author Keith Seitz  ([EMAIL PROTECTED])
+ */
+public class JdwpIdFactory
+{
+  // ID of last object / referencetype
+  private static Object _idLock = new Object ();
+  private static Object _ridLock = new Object ();
+  private static long _lastId = 0;
+  private static long _lastRid = 0;
+
+  // A list of all ID types
+  private static HashMap _idList = new HashMap ();
+
+  // Initialize the id list with known types
+  static
+  {
+    /* ObjectId and ArrayId are special cases. See
+       end if newId. */
+    _idList.put (ClassLoaderId.typeClass, ClassLoaderId.class);
+    _idList.put (ClassObjectId.typeClass, ClassObjectId.class);
+    //_idList.put (FieldId.typeClass, FieldId.class);
+    //_idList.put (FrameId.typeClass, FrameId.class);
+    //_idList.put (MethodId.typeClass, MethodId.class);
+    _idList.put (StringId.typeClass, StringId.class);
+    _idList.put (ThreadId.typeClass, ThreadId.class);
+    _idList.put (ThreadGroupId.typeClass, ThreadGroupId.class);
+  }
+
+  /**
+   * Returns a new id for the given object
+   *
+   * @param object  the object for which an id is desired
+   * @returns a suitable object id
+   */
+  public static JdwpId newId (Object object)
+  {
+    JdwpId id = null;
+    
+    // Loop through all classes until we hit baseclass
+    Class myClass;
+    for (myClass = object.getClass (); myClass != null;
+	 myClass = myClass.getSuperclass ())
+      {
+	Class clz = (Class) _idList.get (myClass);
+	if (clz != null)
+	  {
+	    try
+	      {
+		id = (JdwpId) clz.newInstance ();
+		synchronized (_idLock)
+		  {
+		    id.setId (++_lastId);
+		  }
+		return id;
+	      }
+	    catch (InstantiationException ie)
+	      {
+		// This really should not happen
+		throw new RuntimeException ("cannot create new ID");
+	      }
+	    catch (IllegalAccessException iae)
+	      {
+		// This really should not happen
+		throw new RuntimeException ("illegal access of ID");
+	      }
+	  }
+      }
+
+    /* getSuperclass returned null and no matching ID type found.
+       So there are only two choices left: an array or something
+       deriving from Object. */
+    if (object.getClass ().isArray ())
+      id = new ArrayId ();
+    else
+      id = new ObjectId ();
+
+    synchronized (_idLock)
+      {
+	id.setId (++_lastId);
+      }
+    return id;
+  }
+
+  /**
+   * Returns a new reference type id for the given class
+   *
+   * @param clazz  the <code>Class</code> for which an id is desired
+   * @returns a suitable reference type id or <code>null</code>
+   */
+  public static ReferenceTypeId newReferenceTypeId (Class clazz)
+  {
+    ReferenceTypeId id = null;
+    try
+      {
+	if (clazz.isArray ())
+	  id = new ArrayReferenceTypeId ();
+	else if (clazz.isInterface ())
+	  id = new InterfaceReferenceTypeId ();
+	else
+	  id = new ClassReferenceTypeId ();
+	synchronized (_ridLock)
+	  {
+	    id.setId (++_lastRid);
+	  }
+	return id;
+      }
+    catch (InstantiationException ie)
+      {
+	return null;
+      }
+    catch (IllegalAccessException iae)
+      {
+	return null;
+      }
+  }
+}
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to