OSDN Git Service

Merged gcj-eclipse branch to trunk.
[pf3gnuchains/gcc-fork.git] / libjava / classpath / java / awt / datatransfer / DataFlavor.java
index 0228cd5..baaf43d 100644 (file)
@@ -38,14 +38,13 @@ exception statement from your version. */
 
 package java.awt.datatransfer;
 
-import gnu.classpath.NotImplementedException;
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.io.OptionalDataException;
 import java.io.Reader;
 import java.io.Serializable;
 import java.io.StringReader;
@@ -76,8 +75,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    * deals with bytes not chars. Use <code>getRederForText()</code>.
    */
   public static final DataFlavor plainTextFlavor = 
-    new DataFlavor(java.io.InputStream.class,
-                   "text/plain; charset=unicode",
+    new DataFlavor("text/plain; charset=unicode; class=java.io.InputStream",
                    "plain unicode text");
 
   /**
@@ -94,8 +92,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    * element of the list being a <code>java.io.File</code>.
    */
   public static final DataFlavor javaFileListFlavor = 
-    new DataFlavor(java.util.List.class,
-                   "application/x-java-file-list; class=java.util.List",
+    new DataFlavor("application/x-java-file-list; class=java.util.List",
                    "Java File List");
 
   /**
@@ -132,10 +129,10 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   
   // The MIME type for this flavor
-  private final String mimeType;
+  private MimeType mimeType;
   
   // The representation class for this flavor
-  private final Class representationClass;
+  private Class<?> representationClass;
   
   // The human readable name of this flavor
   private String humanPresentableName;
@@ -156,8 +153,8 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    *
    * @exception ClassNotFoundException If the class cannot be loaded.
    */
-  protected static final Class tryToLoadClass(String className,
-                                             ClassLoader classLoader)
+  protected static final Class<?> tryToLoadClass(String className,
+                                                ClassLoader classLoader)
     throws ClassNotFoundException
   {
     // Bootstrap
@@ -198,62 +195,6 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
     throw new ClassNotFoundException(className);
   }
   
-  private static Class getRepresentationClassFromMimeThrows(String mimeString,
-                                                      ClassLoader classLoader)
-    throws ClassNotFoundException
-    {
-      String classname = getParameter("class", mimeString);
-      if (classname != null)
-        return tryToLoadClass(classname, classLoader);
-      else
-        return java.io.InputStream.class;
-    }
-  // Same as above, but wraps any ClassNotFoundExceptions
-  private static Class getRepresentationClassFromMime(String mimeString,
-                                                      ClassLoader classLoader)
-  {
-    try
-      {
-       return getRepresentationClassFromMimeThrows(mimeString, classLoader);
-      }
-    catch(ClassNotFoundException cnfe)
-      {
-       IllegalArgumentException iae;
-       iae = new IllegalArgumentException("mimeString: "
-                                          + mimeString
-                                          + " classLoader: "
-                                          + classLoader);
-       iae.initCause(cnfe);
-       throw iae;
-      }
-  }
-
-  /**
-   * Returns the value of the named MIME type parameter, or <code>null</code>
-   * if the parameter does not exist. Given the parameter name and the mime
-   * string.
-   *
-   * @param paramName The name of the parameter.
-   * @param mimeString The mime string from where the name should be found.
-   *
-   * @return The value of the parameter or null.
-   */
-  private static String getParameter(String paramName, String mimeString)
-  {
-    int idx = mimeString.indexOf(paramName + "=");
-    if (idx == -1)
-      return(null);
-  
-    String value = mimeString.substring(idx + paramName.length() + 1);
-  
-    idx = value.indexOf(";");
-    if (idx == -1)
-      return(value);
-    else
-      return(value.substring(0, idx));
-  }
-  
   /**
    * XXX - Currently returns <code>plainTextFlavor</code>.
    */
@@ -321,32 +262,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public DataFlavor()
   {
-    mimeType = null;
-    representationClass = null;
-    humanPresentableName = null;
-  }
-
-  /**
-   * Private constructor.
-   */
-  private DataFlavor(Class representationClass,
-                    String mimeType,
-                    String humanPresentableName)
-  {
-    this.representationClass = representationClass;
-    this.mimeType = mimeType;
-
-    // Do some simple validity checks
-    String type = getPrimaryType() + "/" + getSubType();
-    if (type.indexOf(' ') != -1
-        || type.indexOf('=') != -1
-        || type.indexOf(';') != -1)
-      throw new IllegalArgumentException(mimeType);
-
-    if (humanPresentableName != null)
-      this.humanPresentableName = humanPresentableName;
-    else
-      this.humanPresentableName = mimeType;
+    // Used for deserialization only, nothing to do here. 
   }
 
   /**
@@ -359,13 +275,23 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    * @param representationClass The representation class for this object.
    * @param humanPresentableName The display name of the object.
    */
-  public DataFlavor(Class representationClass, String humanPresentableName)
+  public DataFlavor(Class<?> representationClass, String humanPresentableName)
   {
-    this(representationClass,
-         "application/x-java-serialized-object"
-         + "; class="
-         + representationClass.getName(),
-         humanPresentableName);
+    if (representationClass == null)
+      throw new NullPointerException("representationClass must not be null");
+    try
+      {
+        mimeType = new MimeType(javaSerializedObjectMimeType);
+      }
+    catch (MimeTypeParseException ex)
+      {
+        // Must not happen as we use a constant string.
+        assert false;
+      }
+    if (humanPresentableName == null)
+      humanPresentableName = javaSerializedObjectMimeType;
+    this.humanPresentableName = humanPresentableName;
+    this.representationClass = representationClass;
   }
 
   /**
@@ -390,8 +316,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
                    ClassLoader classLoader)
     throws ClassNotFoundException
   {
-    this(getRepresentationClassFromMimeThrows(mimeType, classLoader),
-         mimeType, humanPresentableName);
+    init(mimeType, humanPresentableName, classLoader);
   }
 
   /**
@@ -412,8 +337,17 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public DataFlavor(String mimeType, String humanPresentableName)
   {
-    this(getRepresentationClassFromMime (mimeType, null),
-        mimeType, humanPresentableName);
+    try
+      {
+        init(mimeType, humanPresentableName, getClass().getClassLoader());
+      }
+    catch (ClassNotFoundException ex)
+      {
+        IllegalArgumentException iae =
+          new IllegalArgumentException("Class not found: " + ex.getMessage());
+        iae.initCause(ex);
+        throw iae;
+      }
   }
 
   /**
@@ -432,8 +366,54 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public DataFlavor(String mimeType) throws ClassNotFoundException
   {
-    this(getRepresentationClassFromMimeThrows(mimeType, null),
-        mimeType, null);
+    init(mimeType, null, getClass().getClassLoader());
+  }
+
+  /**
+   * Called by various constructors to initialize this object.
+   *
+   * @param mime the mime string
+   * @param humanPresentableName the human presentable name
+   * @param loader the class loader to use for loading the representation
+   *        class
+   */
+  private void init(String mime, String humanPresentableName,
+                    ClassLoader loader)
+    throws ClassNotFoundException
+  {
+    if (mime == null)
+      throw new NullPointerException("The mime type must not be null");
+    try
+      {
+        mimeType = new MimeType(mime);
+      }
+    catch (MimeTypeParseException ex)
+      {
+        IllegalArgumentException iae =
+          new IllegalArgumentException("Invalid mime type");
+        iae.initCause(ex);
+        throw iae;
+      }
+    String className = mimeType.getParameter("class");
+    if (className == null)
+      {
+        if (mimeType.getBaseType().equals(javaSerializedObjectMimeType))
+          throw new IllegalArgumentException("Serialized object type must have"
+                                        + " a representation class parameter");
+        else
+          representationClass = java.io.InputStream.class;
+      }
+    else
+      representationClass = tryToLoadClass(className, loader);
+    mimeType.addParameter("class", representationClass.getName());
+
+    if (humanPresentableName == null)
+      {
+        humanPresentableName = mimeType.getParameter("humanPresentableName");
+        if (humanPresentableName == null)
+          humanPresentableName = mimeType.getBaseType();
+      }
+    this.humanPresentableName = humanPresentableName;
   }
 
   /**
@@ -443,7 +423,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public String getMimeType()
   {
-    return(mimeType);
+    return(mimeType.toString());
   }
 
   /**
@@ -451,7 +431,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    *
    * @return The representation class for this flavor.
    */
-  public Class getRepresentationClass()
+  public Class<?> getRepresentationClass()
   {
     return(representationClass);
   }
@@ -473,11 +453,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public String getPrimaryType()
   {
-    int idx = mimeType.indexOf("/");
-    if (idx == -1)
-      return(mimeType);
-  
-    return(mimeType.substring(0, idx));
+    return(mimeType.getPrimaryType());
   }
 
   /**
@@ -487,15 +463,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public String getSubType()
   {
-    int start = mimeType.indexOf("/");
-    if (start == -1)
-      return "";
-  
-    int end = mimeType.indexOf(";", start + 1);
-    if (end == -1)
-      return mimeType.substring(start + 1);
-    else
-      return mimeType.substring(start + 1, end);
+    return mimeType.getSubType();
   }
 
   /**
@@ -511,7 +479,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
     if ("humanPresentableName".equals(paramName))
       return getHumanPresentableName();
   
-    return getParameter(paramName, mimeType);
+    return mimeType.getParameter(paramName);
   }
 
   /**
@@ -537,16 +505,22 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public boolean isMimeTypeEqual(String mimeType)
   {
-    String mime = getMimeType();
-    int i = mime.indexOf(";");
-    if (i != -1)
-      mime = mime.substring(0, i);
-  
-    i = mimeType.indexOf(";");
-    if (i != -1)
-      mimeType = mimeType.substring(0, i);
-  
-    return mime.equals(mimeType);
+    if (mimeType == null)
+      throw new NullPointerException("mimeType must not be null");
+    boolean equal = false;
+    try
+      {
+        if (this.mimeType != null)
+          {
+            MimeType other = new MimeType(mimeType);
+            equal = this.mimeType.matches(other);
+          }
+      }
+    catch (MimeTypeParseException ex)
+      {
+        // Return false in this case.
+      }
+    return equal;
   }
 
   /**
@@ -571,7 +545,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public boolean isMimeTypeSerializedObject()
   {
-    return mimeType.startsWith(javaSerializedObjectMimeType);
+    return isMimeTypeEqual(javaSerializedObjectMimeType);
   }
 
   /**
@@ -617,8 +591,8 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public boolean isFlavorSerializedObjectType()
   {
-    // FIXME: What is the diff between this and isMimeTypeSerializedObject?
-    return(mimeType.startsWith(javaSerializedObjectMimeType));
+    return isRepresentationClassSerializable()
+           && isMimeTypeEqual(javaSerializedObjectMimeType);
   }
 
   /**
@@ -629,7 +603,9 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public boolean isFlavorRemoteObjectType()
   {
-    return(mimeType.startsWith(javaRemoteObjectMimeType));
+    return isRepresentationClassRemote()
+           && isRepresentationClassSerializable()
+           && isMimeTypeEqual(javaRemoteObjectMimeType);
   }
 
   /**
@@ -770,7 +746,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    */
   public int hashCode()
   {
-    return mimeType.toLowerCase().hashCode() ^ representationClass.hashCode();
+    return mimeType.toString().hashCode() ^ representationClass.hashCode();
   }
 
   /**
@@ -822,9 +798,17 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    * @exception IOException If an error occurs.
    */
   public void writeExternal(ObjectOutput stream) 
-    throws IOException, NotImplementedException
+    throws IOException
   {
-    // FIXME: Implement me
+    if (mimeType != null)
+      {
+        mimeType.addParameter("humanPresentableName", humanPresentableName);
+        stream.writeObject(mimeType);
+        mimeType.removeParameter("humanPresentableName");
+      }
+    else
+      stream.writeObject(null);
+    stream.writeObject(representationClass);
   }
 
 
@@ -838,9 +822,34 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    * cannot be found.
    */
   public void readExternal(ObjectInput stream) 
-    throws IOException, ClassNotFoundException, NotImplementedException
+    throws IOException, ClassNotFoundException
   {
-    // FIXME: Implement me
+    mimeType = (MimeType) stream.readObject();
+    String className = null;
+    if (mimeType != null)
+      {
+        humanPresentableName =
+          mimeType.getParameter("humanPresentableName");
+        mimeType.removeParameter("humanPresentableName");
+        className = mimeType.getParameter("class");
+        if (className == null)
+          throw new IOException("No class in mime type");
+      }
+    try
+      {
+        representationClass = (Class) stream.readObject();
+      }
+    catch (OptionalDataException ex)
+      {
+        if (ex.eof && ex.length == 0)
+          {
+            if (className != null)
+              representationClass = tryToLoadClass(className,
+                                                  getClass().getClassLoader());
+          }
+        else
+          throw ex;
+      }
   }
 
   /**
@@ -861,7 +870,7 @@ public class DataFlavor implements java.io.Externalizable, Cloneable
    *
    * @since 1.3
    */
-  public final Class getDefaultRepresentationClass()
+  public final Class<?> getDefaultRepresentationClass()
   {
     return java.io.InputStream.class;
   }