8041464: [TEST_BUG] CustomClassLoaderTransferTest does not support OS X
Reviewed-by: azvegint, serb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/AnotherInterface.java Fri Jun 06 14:58:41 2014 +0400
@@ -0,0 +1,3 @@
+import java.io.*;
+
+public interface AnotherInterface extends Serializable {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/CustomClassLoaderTransferTest.java Fri Jun 06 14:58:41 2014 +0400
@@ -0,0 +1,63 @@
+/*
+ @test
+ @bug 4932376
+ @summary verifies that data transfer within one JVM works correctly if
+ the transfer data was created with a custom class loader.
+ @author das@sparc.spb.su area=datatransfer
+ @library ../../regtesthelpers
+ @build TransferableList AnotherInterface CopyClassFile CustomClassLoaderTransferTest
+ @run main CopyClassFile -r ListInterface subdir/
+ @run main CopyClassFile -r TransferableList subdir/
+ @run main CustomClassLoaderTransferTest
+*/
+
+import java.awt.*;
+import java.awt.datatransfer.*;
+import java.io.*;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+public class CustomClassLoaderTransferTest {
+ public static class DFTransferable implements Transferable {
+ private final DataFlavor df;
+ private final Object obj;
+ public DFTransferable(DataFlavor df, Object obj) {
+ this.df = df;
+ this.obj = obj;
+ }
+
+ @Override
+ public Object getTransferData(DataFlavor flavor)
+ throws UnsupportedFlavorException, IOException {
+ if (df.equals(flavor)) {
+ return obj;
+ } else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+
+ @Override
+ public DataFlavor[] getTransferDataFlavors(){
+ return new DataFlavor[] { df };
+ }
+
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return df.equals(flavor);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
+ URL url = new File("./subdir/").toURL();
+ ClassLoader classLoader = new URLClassLoader(new URL[] { url },
+ CustomClassLoaderTransferTest.class.getClassLoader());
+ Class clazz = Class.forName("TransferableList", true, classLoader);
+ DataFlavor df = new DataFlavor(clazz, "Transferable List");
+ Object obj = clazz.newInstance();
+ Transferable t = new DFTransferable(df, obj);
+ c.setContents(t, null);
+ Transferable ct = c.getContents(null);
+ ct.getTransferData(df);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/TransferableList.java Fri Jun 06 14:58:41 2014 +0400
@@ -0,0 +1,30 @@
+import java.io.Serializable;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+
+public class TransferableList extends ArrayList {
+ private static class NullInvocationHandler implements InvocationHandler, Serializable {
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ throw new Error("UNIMPLEMENTED");
+ }
+ }
+
+ public TransferableList() {
+ try {
+ InvocationHandler handler = new NullInvocationHandler();
+ Class<?> proxyClass = Proxy.getProxyClass(
+ ListInterface.class.getClassLoader(),
+ new Class[] { ListInterface.class, AnotherInterface.class });
+ AnotherInterface obj = (AnotherInterface) proxyClass.
+ getConstructor(new Class[]{InvocationHandler.class}).
+ newInstance(handler);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
+
+interface ListInterface extends Serializable {}
--- a/jdk/test/java/awt/regtesthelpers/CopyClassFile.java Fri Jun 06 14:52:07 2014 +0400
+++ b/jdk/test/java/awt/regtesthelpers/CopyClassFile.java Fri Jun 06 14:58:41 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,6 +39,8 @@
*
* @build CopyClassFile
* @run main CopyClassFile package.class dest_directory
+ *
+ * In case the source file should be removed add -r option
*/
public class CopyClassFile {
@@ -48,13 +50,17 @@
private static String className;
private static String classFile;
+ private static boolean removeSource = false;
+
public static void main(String[] args) throws Exception {
- if (args.length != 2) {
+ if (args.length < 2) {
throw new IllegalArgumentException("Illegal usage: class name and destination directory should be specified");
}
- destinationDir = args[1];
- className = args[0];
+ int classNameIndex = parseOptions(args);
+
+ className = args[classNameIndex];
+ destinationDir = args[classNameIndex + 1];
classFile = className.replaceAll("\\.", File.separator) + ".class";
URL url = cl.getResource(classFile);
@@ -69,6 +75,21 @@
Arrays.stream(files).forEach(CopyClassFile::copyFile);
}
+ private static int parseOptions(String[] args) {
+ int optionsEnd = 0;
+ while (args[optionsEnd].startsWith("-")) {
+ switch (args[optionsEnd].substring(1)) {
+ case "r" :
+ removeSource = true;
+ break;
+ default:
+ throw new RuntimeException("Unrecognized option passed to CopyClassFile: " + args[optionsEnd]);
+ }
+ optionsEnd++;
+ }
+ return optionsEnd;
+ }
+
private static String cutPackageName(String className) {
int dotIndex = className.lastIndexOf(".") + 1;
if (dotIndex <= 0) {
@@ -87,6 +108,11 @@
try (InputStream is = new FileInputStream(f)) {
Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
}
+
+ if (removeSource && !f.delete()) {
+ throw new RuntimeException("Failed to delete a file");
+ }
+
} catch (IOException ex) {
throw new RuntimeException("Could not copy file " + f, ex);
}