# HG changeset patch # User pchelko # Date 1402052321 -14400 # Node ID ee53c90dfeb10c0186846f183984a70e5118ba18 # Parent a327a33a1e0afb941b94fc3681b04df3c3fe0f66 8041464: [TEST_BUG] CustomClassLoaderTransferTest does not support OS X Reviewed-by: azvegint, serb diff -r a327a33a1e0a -r ee53c90dfeb1 jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/AnotherInterface.java --- /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 {} diff -r a327a33a1e0a -r ee53c90dfeb1 jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/CustomClassLoaderTransferTest.java --- /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); + } +} diff -r a327a33a1e0a -r ee53c90dfeb1 jdk/test/java/awt/datatransfer/CustomClassLoaderTransferTest/TransferableList.java --- /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 {} diff -r a327a33a1e0a -r ee53c90dfeb1 jdk/test/java/awt/regtesthelpers/CopyClassFile.java --- 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); }