Hi all,

I just committed a patch that implements serialization in
java.net.SocketPermission.  I had to add a dummy field,
"actions", in order for the serialized representation to
match that from a proprietary JVM.  This seems sucky, but
I think it's the only way.

Cheers,
Gary
k
Index: ChangeLog
===================================================================
RCS file: /cvsroot/classpath/classpath/ChangeLog,v
retrieving revision 1.6155
diff -u -r1.6155 ChangeLog
--- ChangeLog   24 Jan 2006 14:06:11 -0000      1.6155
+++ ChangeLog   24 Jan 2006 14:07:28 -0000
@@ -1,3 +1,7 @@
+2006-01-24  Gary Benson  <[EMAIL PROTECTED]>
+
+       * java/net/SocketPermission.java: Implemented serialization.
+
 2006-01-24  David Gilbert  <[EMAIL PROTECTED]>
 
        * javax/swing/text/StringContent.java
Index: java/net/SocketPermission.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/net/SocketPermission.java,v
retrieving revision 1.18
diff -u -r1.18 SocketPermission.java
--- java/net/SocketPermission.java      23 Jan 2006 15:40:55 -0000      1.18
+++ java/net/SocketPermission.java      24 Jan 2006 14:07:28 -0000
@@ -38,6 +38,9 @@
 
 package java.net;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.security.Permission;
 import java.security.PermissionCollection;
@@ -113,18 +116,16 @@
 {
   static final long serialVersionUID = -7204263841984476862L;
 
-// FIXME: Needs serialization work, including readObject/writeObject methods.
-
   /**
    * A hostname (possibly wildcarded) or IP address (IPv4 or IPv6).
    */
-  private String host;
+  private transient String host;
 
   /**
    * A range of ports.
    */
-  private int minport;
-  private int maxport;
+  private transient int minport;
+  private transient int maxport;
 
   /**
    * Values used for minimum and maximum ports when one or both bounds
@@ -136,9 +137,17 @@
   private static final int MAX_PORT = Integer.MAX_VALUE;
 
   /**
-   * A bitmask representing the actions for which we have permission
+   * The actions for which we have permission.  This field is present
+   * to make the serialized form correct and should not be used by
+   * anything other than writeObject: everything else should use
+   * actionmask.
    */
-  private int actions;
+  private String actions;
+
+  /**
+   * A bitmask representing the actions for which we have permission.
+   */
+  private transient int actionmask;
 
   /**
    * The available actions, in the canonical order required for getActions().
@@ -146,7 +155,7 @@
   private static final String[] ACTIONS = new String[] {
     "connect", "listen", "accept", "resolve"};
 
-/**
+  /**
    * Initializes a new instance of <code>SocketPermission</code> with the
    * specified host/port combination and actions string.
    *
@@ -252,7 +261,7 @@
    */
   private void setActions(String actionstring)
   {
-    actions = 0;
+    actionmask = 0;
 
     boolean resolve_needed = false;
     boolean resolve_present = false;
@@ -282,7 +291,7 @@
       {
        if (action.equals(ACTIONS[i]))
          {
-           actions |= 1 << i;
+           actionmask |= 1 << i;
            return;
          }
       }
@@ -309,7 +318,7 @@
     else
       return false;
 
-    return p.actions == actions &&
+    return p.actionmask == actionmask &&
       p.minport == minport &&
       p.maxport == maxport &&
       p.host.equals(host);
@@ -323,7 +332,7 @@
    */
   public int hashCode()
   {
-    return actions + minport + maxport + host.hashCode();
+    return actionmask + minport + maxport + host.hashCode();
   }
 
   /**
@@ -338,7 +347,7 @@
 
     for (int i = 0; i < ACTIONS.length; i++)
       {
-       if ((actions & (1 << i)) != 0)
+       if ((actionmask & (1 << i)) != 0)
          {
            if (sb.length() != 0)
              sb.append(",");
@@ -398,7 +407,7 @@
       return false;
 
     // Next check the actions
-    if ((p.actions & actions) != p.actions)
+    if ((p.actionmask & actionmask) != p.actionmask)
        return false;
 
     // Then check the ports
@@ -442,4 +451,35 @@
     // Didn't make it
     return false;
   }
+
+  /**
+   * Deserializes a <code>SocketPermission</code> object from
+   * an input stream.
+   *
+   * @param input the input stream.
+   * @throws IOException if an I/O error occurs in the stream.
+   * @throws ClassNotFoundException if the class of the
+   *         serialized object could not be found.
+   */
+  private void readObject(ObjectInputStream input)
+    throws IOException, ClassNotFoundException
+  {
+    input.defaultReadObject();
+    setHostPort(getName());
+    setActions(actions);
+  }
+
+  /**
+   * Serializes a <code>SocketPermission</code> object to an
+   * output stream.
+   *
+   * @param output the output stream.
+   * @throws IOException if an I/O error occurs in the stream.
+   */
+  private void writeObject(ObjectOutputStream output)
+    throws IOException
+  {
+    actions = getActions();
+    output.defaultWriteObject();
+  }
 }
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to