Merged gcj-eclipse branch to trunk.
From-SVN: r120621
This commit is contained in:
parent
c648dedbde
commit
97b8365caf
17478 changed files with 606493 additions and 100744 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue