Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View 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;
}