src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java
author egahlin
Fri, 10 May 2019 18:53:35 +0200
branchJEP-349-branch
changeset 57356 2cf72293e1db
parent 47216 71c04702a3d5
permissions -rw-r--r--
Initial changes for JEP 349
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     1
/*
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
     2
 * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     4
 *
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    10
 *
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    15
 * accompanied this code).
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    16
 *
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    20
 *
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    23
 * questions.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    24
 */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    25
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    26
package sun.datatransfer;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    27
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    28
import java.awt.datatransfer.DataFlavor;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    29
import java.awt.datatransfer.FlavorMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    30
import java.io.IOException;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    31
import java.io.InputStream;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    32
import java.io.Reader;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    33
import java.lang.reflect.Constructor;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    34
import java.lang.reflect.InvocationTargetException;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    35
import java.lang.reflect.Method;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    36
import java.nio.ByteBuffer;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    37
import java.nio.CharBuffer;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    38
import java.nio.charset.Charset;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    39
import java.nio.charset.IllegalCharsetNameException;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    40
import java.nio.charset.StandardCharsets;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    41
import java.nio.charset.UnsupportedCharsetException;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    42
import java.util.Collections;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    43
import java.util.Comparator;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    44
import java.util.HashMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    45
import java.util.Iterator;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    46
import java.util.LinkedHashSet;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    47
import java.util.Map;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    48
import java.util.ServiceLoader;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    49
import java.util.Set;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    50
import java.util.SortedSet;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    51
import java.util.TreeSet;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    52
import java.util.function.Supplier;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    53
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    54
/**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
    55
 * Utility class with different datatransfer helper functions.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    56
 *
35302
e4d2275861c3 8136494: Update "@since 1.9" to "@since 9" to match java.version.specification
iris
parents: 31887
diff changeset
    57
 * @since 9
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    58
 */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    59
public class DataFlavorUtil {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    60
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    61
    private DataFlavorUtil() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    62
        // Avoid instantiation
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    63
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    64
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    65
    private static Comparator<String> getCharsetComparator() {
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
    66
        return CharsetComparator.INSTANCE;
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    67
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    68
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    69
    public static Comparator<DataFlavor> getDataFlavorComparator() {
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
    70
        return DataFlavorComparator.INSTANCE;
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    71
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    72
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    73
    public static Comparator<Long> getIndexOrderComparator(Map<Long, Integer> indexMap) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    74
        return new IndexOrderComparator(indexMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    75
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    76
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    77
    public static Comparator<DataFlavor> getTextFlavorComparator() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    78
        return TextFlavorComparator.INSTANCE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    79
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    80
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    81
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    82
     * Tracks whether a particular text/* MIME type supports the charset
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    83
     * parameter. The Map is initialized with all of the standard MIME types
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    84
     * listed in the DataFlavor.selectBestTextFlavor method comment. Additional
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
    85
     * entries may be added during the life of the JRE for text/&lt;other&gt;
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
    86
     * types.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    87
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    88
    private static final Map<String, Boolean> textMIMESubtypeCharsetSupport;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    89
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    90
    static {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    91
        Map<String, Boolean> tempMap = new HashMap<>(17);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    92
        tempMap.put("sgml", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    93
        tempMap.put("xml", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    94
        tempMap.put("html", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    95
        tempMap.put("enriched", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    96
        tempMap.put("richtext", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    97
        tempMap.put("uri-list", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    98
        tempMap.put("directory", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
    99
        tempMap.put("css", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   100
        tempMap.put("calendar", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   101
        tempMap.put("plain", Boolean.TRUE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   102
        tempMap.put("rtf", Boolean.FALSE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   103
        tempMap.put("tab-separated-values", Boolean.FALSE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   104
        tempMap.put("t140", Boolean.FALSE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   105
        tempMap.put("rfc822-headers", Boolean.FALSE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   106
        tempMap.put("parityfec", Boolean.FALSE);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   107
        textMIMESubtypeCharsetSupport = Collections.synchronizedMap(tempMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   108
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   109
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   110
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   111
     * Lazy initialization of Standard Encodings.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   112
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   113
    private static class StandardEncodingsHolder {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   114
        private static final SortedSet<String> standardEncodings = load();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   115
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   116
        private static SortedSet<String> load() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   117
            final SortedSet<String> tempSet = new TreeSet<>(getCharsetComparator().reversed());
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   118
            tempSet.add("US-ASCII");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   119
            tempSet.add("ISO-8859-1");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   120
            tempSet.add("UTF-8");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   121
            tempSet.add("UTF-16BE");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   122
            tempSet.add("UTF-16LE");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   123
            tempSet.add("UTF-16");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   124
            tempSet.add(Charset.defaultCharset().name());
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   125
            return Collections.unmodifiableSortedSet(tempSet);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   126
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   127
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   128
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   129
    /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   130
     * Returns a {@code SortedSet} of Strings which are a total order of the
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   131
     * standard character sets supported by the JRE. The ordering follows the
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   132
     * same principles as {@link DataFlavor#selectBestTextFlavor(DataFlavor[])}.
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   133
     * So as to avoid loading all available character converters, optional,
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   134
     * non-standard, character sets are not included.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   135
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   136
    public static Set<String> standardEncodings() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   137
        return StandardEncodingsHolder.standardEncodings;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   138
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   139
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   140
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   141
     * Converts an arbitrary text encoding to its canonical name.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   142
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   143
    public static String canonicalName(String encoding) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   144
        if (encoding == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   145
            return null;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   146
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   147
        try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   148
            return Charset.forName(encoding).name();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   149
        } catch (IllegalCharsetNameException icne) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   150
            return encoding;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   151
        } catch (UnsupportedCharsetException uce) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   152
            return encoding;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   153
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   154
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   155
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   156
    /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   157
     * Tests only whether the flavor's MIME type supports the charset parameter.
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   158
     * Must only be called for flavors with a primary type of "text".
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   159
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   160
    public static boolean doesSubtypeSupportCharset(DataFlavor flavor) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   161
        String subType = flavor.getSubType();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   162
        if (subType == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   163
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   164
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   165
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   166
        Boolean support = textMIMESubtypeCharsetSupport.get(subType);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   167
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   168
        if (support != null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   169
            return support;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   170
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   171
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   172
        boolean ret_val = (flavor.getParameter("charset") != null);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   173
        textMIMESubtypeCharsetSupport.put(subType, ret_val);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   174
        return ret_val;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   175
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   176
    public static boolean doesSubtypeSupportCharset(String subType,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   177
                                                    String charset)
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   178
    {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   179
        Boolean support = textMIMESubtypeCharsetSupport.get(subType);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   180
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   181
        if (support != null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   182
            return support;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   183
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   184
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   185
        boolean ret_val = (charset != null);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   186
        textMIMESubtypeCharsetSupport.put(subType, ret_val);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   187
        return ret_val;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   188
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   189
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   190
    /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   191
     * Returns whether this flavor is a text type which supports the 'charset'
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   192
     * parameter.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   193
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   194
    public static boolean isFlavorCharsetTextType(DataFlavor flavor) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   195
        // Although stringFlavor doesn't actually support the charset
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   196
        // parameter (because its primary MIME type is not "text"), it should
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   197
        // be treated as though it does. stringFlavor is semantically
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   198
        // equivalent to "text/plain" data.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   199
        if (DataFlavor.stringFlavor.equals(flavor)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   200
            return true;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   201
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   202
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   203
        if (!"text".equals(flavor.getPrimaryType()) ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   204
                !doesSubtypeSupportCharset(flavor))
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   205
        {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   206
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   207
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   208
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   209
        Class<?> rep_class = flavor.getRepresentationClass();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   210
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   211
        if (flavor.isRepresentationClassReader() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   212
                String.class.equals(rep_class) ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   213
                flavor.isRepresentationClassCharBuffer() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   214
                char[].class.equals(rep_class))
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   215
        {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   216
            return true;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   217
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   218
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   219
        if (!(flavor.isRepresentationClassInputStream() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   220
                flavor.isRepresentationClassByteBuffer() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   221
                byte[].class.equals(rep_class))) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   222
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   223
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   224
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   225
        String charset = flavor.getParameter("charset");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   226
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   227
        // null equals default encoding which is always supported
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   228
        return (charset == null) || isEncodingSupported(charset);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   229
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   230
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   231
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   232
     * Returns whether this flavor is a text type which does not support the
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   233
     * 'charset' parameter.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   234
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   235
    public static boolean isFlavorNoncharsetTextType(DataFlavor flavor) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   236
        if (!"text".equals(flavor.getPrimaryType()) || doesSubtypeSupportCharset(flavor)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   237
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   238
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   239
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   240
        return (flavor.isRepresentationClassInputStream() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   241
                flavor.isRepresentationClassByteBuffer() ||
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   242
                byte[].class.equals(flavor.getRepresentationClass()));
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   243
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   244
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   245
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   246
     * If the specified flavor is a text flavor which supports the "charset"
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   247
     * parameter, then this method returns that parameter, or the default
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   248
     * charset if no such parameter was specified at construction. For non-text
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   249
     * DataFlavors, and for non-charset text flavors, this method returns
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   250
     * {@code null}.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   251
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   252
    public static String getTextCharset(DataFlavor flavor) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   253
        if (!isFlavorCharsetTextType(flavor)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   254
            return null;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   255
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   256
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   257
        String encoding = flavor.getParameter("charset");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   258
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   259
        return (encoding != null) ? encoding : Charset.defaultCharset().name();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   260
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   261
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   262
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   263
     * Determines whether this JRE can both encode and decode text in the
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   264
     * specified encoding.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   265
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   266
    private static boolean isEncodingSupported(String encoding) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   267
        if (encoding == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   268
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   269
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   270
        try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   271
            return Charset.isSupported(encoding);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   272
        } catch (IllegalCharsetNameException icne) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   273
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   274
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   275
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   276
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   277
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   278
     * Helper method to compare two objects by their Integer indices in the
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   279
     * given map. If the map doesn't contain an entry for either of the objects,
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   280
     * the fallback index will be used for the object instead.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   281
     *
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   282
     * @param  indexMap the map which maps objects into Integer indexes
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   283
     * @param  obj1 the first object to be compared
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   284
     * @param  obj2 the second object to be compared
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   285
     * @param  fallbackIndex the Integer to be used as a fallback index
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   286
     * @return a negative integer, zero, or a positive integer as the first
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   287
     *         object is mapped to a less, equal to, or greater index than the
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   288
     *         second
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   289
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   290
    static <T> int compareIndices(Map<T, Integer> indexMap,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   291
                                  T obj1, T obj2,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   292
                                  Integer fallbackIndex) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   293
        Integer index1 = indexMap.getOrDefault(obj1, fallbackIndex);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   294
        Integer index2 = indexMap.getOrDefault(obj2, fallbackIndex);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   295
        return index1.compareTo(index2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   296
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   297
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   298
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   299
     * An IndexedComparator which compares two String charsets. The comparison
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   300
     * follows the rules outlined in DataFlavor.selectBestTextFlavor. In order
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   301
     * to ensure that non-Unicode, non-ASCII, non-default charsets are sorted
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   302
     * in alphabetical order, charsets are not automatically converted to their
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   303
     * canonical forms.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   304
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   305
    private static class CharsetComparator implements Comparator<String> {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   306
        static final CharsetComparator INSTANCE = new CharsetComparator();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   307
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   308
        private static final Map<String, Integer> charsets;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   309
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   310
        private static final Integer DEFAULT_CHARSET_INDEX = 2;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   311
        private static final Integer OTHER_CHARSET_INDEX = 1;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   312
        private static final Integer WORST_CHARSET_INDEX = 0;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   313
        private static final Integer UNSUPPORTED_CHARSET_INDEX = Integer.MIN_VALUE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   314
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   315
        private static final String UNSUPPORTED_CHARSET = "UNSUPPORTED";
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   316
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   317
        static {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   318
            Map<String, Integer> charsetsMap = new HashMap<>(8, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   319
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   320
            // we prefer Unicode charsets
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   321
            charsetsMap.put(canonicalName("UTF-16LE"), 4);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   322
            charsetsMap.put(canonicalName("UTF-16BE"), 5);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   323
            charsetsMap.put(canonicalName("UTF-8"), 6);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   324
            charsetsMap.put(canonicalName("UTF-16"), 7);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   325
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   326
            // US-ASCII is the worst charset supported
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   327
            charsetsMap.put(canonicalName("US-ASCII"), WORST_CHARSET_INDEX);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   328
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   329
            charsetsMap.putIfAbsent(Charset.defaultCharset().name(), DEFAULT_CHARSET_INDEX);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   330
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   331
            charsetsMap.put(UNSUPPORTED_CHARSET, UNSUPPORTED_CHARSET_INDEX);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   332
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   333
            charsets = Collections.unmodifiableMap(charsetsMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   334
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   335
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   336
        /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   337
         * Compares charsets. Returns a negative integer, zero, or a positive
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   338
         * integer as the first charset is worse than, equal to, or better than
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   339
         * the second.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   340
         * <p>
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   341
         * Charsets are ordered according to the following rules:
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   342
         * <ul>
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   343
         * <li>All unsupported charsets are equal</li>
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   344
         * <li>Any unsupported charset is worse than any supported charset.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   345
         * <li>Unicode charsets, such as "UTF-16", "UTF-8", "UTF-16BE" and
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   346
         *     "UTF-16LE", are considered best</li>
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   347
         * <li>After them, platform default charset is selected</li>
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   348
         * <li>"US-ASCII" is the worst of supported charsets</li>
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   349
         * <li>For all other supported charsets, the lexicographically less one
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   350
         *     is considered the better</li>
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   351
         * </ul>
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   352
         *
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   353
         * @param  charset1 the first charset to be compared
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   354
         * @param  charset2 the second charset to be compared
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   355
         * @return a negative integer, zero, or a positive integer as the first
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   356
         *         argument is worse, equal to, or better than the second
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   357
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   358
        public int compare(String charset1, String charset2) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   359
            charset1 = getEncoding(charset1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   360
            charset2 = getEncoding(charset2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   361
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   362
            int comp = compareIndices(charsets, charset1, charset2, OTHER_CHARSET_INDEX);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   363
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   364
            if (comp == 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   365
                return charset2.compareTo(charset1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   366
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   367
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   368
            return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   369
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   370
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   371
        /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   372
         * Returns encoding for the specified charset according to the following
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   373
         * rules:
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   374
         * <ul>
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   375
         * <li>If the charset is {@code null}, then {@code null} will be
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   376
         *     returned</li>
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   377
         * <li>Iff the charset specifies an encoding unsupported by this JRE,
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   378
         *     {@code UNSUPPORTED_CHARSET} will be returned</li>
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   379
         * <li>If the charset specifies an alias name, the corresponding
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   380
         *     canonical name will be returned iff the charset is a known
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   381
         *     Unicode, ASCII, or default charset</li>
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   382
         * </ul>
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   383
         *
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   384
         * @param  charset the charset
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   385
         * @return an encoding for this charset
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   386
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   387
        static String getEncoding(String charset) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   388
            if (charset == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   389
                return null;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   390
            } else if (!isEncodingSupported(charset)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   391
                return UNSUPPORTED_CHARSET;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   392
            } else {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   393
                // Only convert to canonical form if the charset is one
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   394
                // of the charsets explicitly listed in the known charsets
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   395
                // map. This will happen only for Unicode, ASCII, or default
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   396
                // charsets.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   397
                String canonicalName = canonicalName(charset);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   398
                return (charsets.containsKey(canonicalName))
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   399
                        ? canonicalName
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   400
                        : charset;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   401
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   402
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   403
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   404
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   405
    /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   406
     * An IndexedComparator which compares two DataFlavors. For text flavors,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   407
     * the comparison follows the rules outlined in
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   408
     * {@link DataFlavor#selectBestTextFlavor selectBestTextFlavor}. For
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   409
     * non-text flavors, unknown application MIME types are preferred, followed
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   410
     * by known application/x-java-* MIME types. Unknown application types are
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   411
     * preferred because if the user provides his own data flavor, it will
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   412
     * likely be the most descriptive one. For flavors which are otherwise
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   413
     * equal, the flavors' string representation are compared in the
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   414
     * alphabetical order.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   415
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   416
    private static class DataFlavorComparator implements Comparator<DataFlavor> {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   417
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   418
        static final DataFlavorComparator INSTANCE = new DataFlavorComparator();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   419
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   420
        private static final Map<String, Integer> exactTypes;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   421
        private static final Map<String, Integer> primaryTypes;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   422
        private static final Map<Class<?>, Integer> nonTextRepresentations;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   423
        private static final Map<String, Integer> textTypes;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   424
        private static final Map<Class<?>, Integer> decodedTextRepresentations;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   425
        private static final Map<Class<?>, Integer> encodedTextRepresentations;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   426
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   427
        private static final Integer UNKNOWN_OBJECT_LOSES = Integer.MIN_VALUE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   428
        private static final Integer UNKNOWN_OBJECT_WINS = Integer.MAX_VALUE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   429
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   430
        static {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   431
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   432
                Map<String, Integer> exactTypesMap = new HashMap<>(4, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   433
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   434
                // application/x-java-* MIME types
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   435
                exactTypesMap.put("application/x-java-file-list", 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   436
                exactTypesMap.put("application/x-java-serialized-object", 1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   437
                exactTypesMap.put("application/x-java-jvm-local-objectref", 2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   438
                exactTypesMap.put("application/x-java-remote-object", 3);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   439
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   440
                exactTypes = Collections.unmodifiableMap(exactTypesMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   441
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   442
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   443
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   444
                Map<String, Integer> primaryTypesMap = new HashMap<>(1, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   445
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   446
                primaryTypesMap.put("application", 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   447
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   448
                primaryTypes = Collections.unmodifiableMap(primaryTypesMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   449
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   450
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   451
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   452
                Map<Class<?>, Integer> nonTextRepresentationsMap = new HashMap<>(3, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   453
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   454
                nonTextRepresentationsMap.put(java.io.InputStream.class, 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   455
                nonTextRepresentationsMap.put(java.io.Serializable.class, 1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   456
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   457
                nonTextRepresentationsMap.put(RMI.remoteClass(), 2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   458
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   459
                nonTextRepresentations = Collections.unmodifiableMap(nonTextRepresentationsMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   460
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   461
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   462
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   463
                Map<String, Integer> textTypesMap = new HashMap<>(16, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   464
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   465
                // plain text
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   466
                textTypesMap.put("text/plain", 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   467
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   468
                // stringFlavor
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   469
                textTypesMap.put("application/x-java-serialized-object", 1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   470
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   471
                // misc
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   472
                textTypesMap.put("text/calendar", 2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   473
                textTypesMap.put("text/css", 3);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   474
                textTypesMap.put("text/directory", 4);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   475
                textTypesMap.put("text/parityfec", 5);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   476
                textTypesMap.put("text/rfc822-headers", 6);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   477
                textTypesMap.put("text/t140", 7);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   478
                textTypesMap.put("text/tab-separated-values", 8);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   479
                textTypesMap.put("text/uri-list", 9);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   480
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   481
                // enriched
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   482
                textTypesMap.put("text/richtext", 10);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   483
                textTypesMap.put("text/enriched", 11);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   484
                textTypesMap.put("text/rtf", 12);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   485
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   486
                // markup
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   487
                textTypesMap.put("text/html", 13);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   488
                textTypesMap.put("text/xml", 14);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   489
                textTypesMap.put("text/sgml", 15);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   490
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   491
                textTypes = Collections.unmodifiableMap(textTypesMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   492
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   493
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   494
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   495
                Map<Class<?>, Integer> decodedTextRepresentationsMap = new HashMap<>(4, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   496
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   497
                decodedTextRepresentationsMap.put(char[].class, 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   498
                decodedTextRepresentationsMap.put(CharBuffer.class, 1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   499
                decodedTextRepresentationsMap.put(String.class, 2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   500
                decodedTextRepresentationsMap.put(Reader.class, 3);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   501
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   502
                decodedTextRepresentations =
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   503
                        Collections.unmodifiableMap(decodedTextRepresentationsMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   504
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   505
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   506
            {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   507
                Map<Class<?>, Integer> encodedTextRepresentationsMap = new HashMap<>(3, 1.0f);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   508
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   509
                encodedTextRepresentationsMap.put(byte[].class, 0);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   510
                encodedTextRepresentationsMap.put(ByteBuffer.class, 1);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   511
                encodedTextRepresentationsMap.put(InputStream.class, 2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   512
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   513
                encodedTextRepresentations =
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   514
                        Collections.unmodifiableMap(encodedTextRepresentationsMap);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   515
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   516
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   517
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   518
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   519
        public int compare(DataFlavor flavor1, DataFlavor flavor2) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   520
            if (flavor1.equals(flavor2)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   521
                return 0;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   522
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   523
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   524
            int comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   525
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   526
            String primaryType1 = flavor1.getPrimaryType();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   527
            String subType1 = flavor1.getSubType();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   528
            String mimeType1 = primaryType1 + "/" + subType1;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   529
            Class<?> class1 = flavor1.getRepresentationClass();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   530
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   531
            String primaryType2 = flavor2.getPrimaryType();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   532
            String subType2 = flavor2.getSubType();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   533
            String mimeType2 = primaryType2 + "/" + subType2;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   534
            Class<?> class2 = flavor2.getRepresentationClass();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   535
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   536
            if (flavor1.isFlavorTextType() && flavor2.isFlavorTextType()) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   537
                // First, compare MIME types
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   538
                comp = compareIndices(textTypes, mimeType1, mimeType2, UNKNOWN_OBJECT_LOSES);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   539
                if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   540
                    return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   541
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   542
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   543
                // Only need to test one flavor because they both have the
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   544
                // same MIME type. Also don't need to worry about accidentally
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   545
                // passing stringFlavor because either
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   546
                //   1. Both flavors are stringFlavor, in which case the
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   547
                //      equality test at the top of the function succeeded.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   548
                //   2. Only one flavor is stringFlavor, in which case the MIME
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   549
                //      type comparison returned a non-zero value.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   550
                if (doesSubtypeSupportCharset(flavor1)) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   551
                    // Next, prefer the decoded text representations of Reader,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   552
                    // String, CharBuffer, and [C, in that order.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   553
                    comp = compareIndices(decodedTextRepresentations, class1,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   554
                            class2, UNKNOWN_OBJECT_LOSES);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   555
                    if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   556
                        return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   557
                    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   558
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   559
                    // Next, compare charsets
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   560
                    comp = CharsetComparator.INSTANCE.compare(getTextCharset(flavor1),
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   561
                            getTextCharset(flavor2));
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   562
                    if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   563
                        return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   564
                    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   565
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   566
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   567
                // Finally, prefer the encoded text representations of
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   568
                // InputStream, ByteBuffer, and [B, in that order.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   569
                comp = compareIndices(encodedTextRepresentations, class1,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   570
                        class2, UNKNOWN_OBJECT_LOSES);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   571
                if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   572
                    return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   573
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   574
            } else {
31887
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   575
                // First, prefer text types
27057
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   576
                if (flavor1.isFlavorTextType()) {
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   577
                    return 1;
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   578
                }
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   579
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   580
                if (flavor2.isFlavorTextType()) {
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   581
                    return -1;
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   582
                }
2202074399cf 8058473: "Comparison method violates its general contract" when using Clipboard
anashaty
parents: 26037
diff changeset
   583
31887
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   584
                // Next, prefer application types.
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   585
                comp = compareIndices(primaryTypes, primaryType1, primaryType2,
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   586
                        UNKNOWN_OBJECT_LOSES);
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   587
                if (comp != 0) {
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   588
                    return comp;
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   589
                }
a0b91dedca5c 8130242: DataFlavorComparator transitivity exception
ssadetsky
parents: 31061
diff changeset
   590
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   591
                // Next, look for application/x-java-* types. Prefer unknown
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   592
                // MIME types because if the user provides his own data flavor,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   593
                // it will likely be the most descriptive one.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   594
                comp = compareIndices(exactTypes, mimeType1, mimeType2,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   595
                        UNKNOWN_OBJECT_WINS);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   596
                if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   597
                    return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   598
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   599
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   600
                // Finally, prefer the representation classes of Remote,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   601
                // Serializable, and InputStream, in that order.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   602
                comp = compareIndices(nonTextRepresentations, class1, class2,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   603
                        UNKNOWN_OBJECT_LOSES);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   604
                if (comp != 0) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   605
                    return comp;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   606
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   607
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   608
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   609
            // The flavours are not equal but still not distinguishable.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   610
            // Compare String representations in alphabetical order
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   611
            return flavor1.getMimeType().compareTo(flavor2.getMimeType());
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   612
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   613
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   614
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   615
    /**
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   616
     * Given the Map that maps objects to Integer indices and a boolean value,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   617
     * this Comparator imposes a direct or reverse order on set of objects.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   618
     * <p>
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   619
     * If the specified boolean value is SELECT_BEST, the Comparator imposes the
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   620
     * direct index-based order: an object A is greater than an object B if and
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   621
     * only if the index of A is greater than the index of B. An object that
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   622
     * doesn't have an associated index is less or equal than any other object.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   623
     * <p>
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   624
     * If the specified boolean value is SELECT_WORST, the Comparator imposes
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   625
     * the reverse index-based order: an object A is greater than an object B if
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   626
     * and only if A is less than B with the direct index-based order.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   627
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   628
    private static class IndexOrderComparator implements Comparator<Long> {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   629
        private final Map<Long, Integer> indexMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   630
        private static final Integer FALLBACK_INDEX = Integer.MIN_VALUE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   631
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   632
        public IndexOrderComparator(Map<Long, Integer> indexMap) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   633
            this.indexMap = indexMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   634
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   635
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   636
        public int compare(Long obj1, Long obj2) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   637
            return compareIndices(indexMap, obj1, obj2, FALLBACK_INDEX);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   638
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   639
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   640
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   641
    private static class TextFlavorComparator extends DataFlavorComparator {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   642
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   643
        static final TextFlavorComparator INSTANCE = new TextFlavorComparator();
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   644
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   645
        /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   646
         * Compares two {@code DataFlavor} objects. Returns a negative integer,
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   647
         * zero, or a positive integer as the first {@code DataFlavor} is worse
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   648
         * than, equal to, or better than the second.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   649
         * <p>
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   650
         * {@code DataFlavor}s are ordered according to the rules outlined for
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   651
         * {@link DataFlavor#selectBestTextFlavor selectBestTextFlavor}.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   652
         *
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   653
         * @param  flavor1 the first {@code DataFlavor} to be compared
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   654
         * @param  flavor2 the second {@code DataFlavor} to be compared
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   655
         * @return a negative integer, zero, or a positive integer as the first
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   656
         *         argument is worse, equal to, or better than the second
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   657
         * @throws ClassCastException if either of the arguments is not an
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   658
         *         instance of {@code DataFlavor}
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   659
         * @throws NullPointerException if either of the arguments is
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   660
         *         {@code null}
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   661
         * @see DataFlavor#selectBestTextFlavor
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   662
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   663
        public int compare(DataFlavor flavor1, DataFlavor flavor2) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   664
            if (flavor1.isFlavorTextType()) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   665
                if (flavor2.isFlavorTextType()) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   666
                    return super.compare(flavor1, flavor2);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   667
                } else {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   668
                    return 1;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   669
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   670
            } else if (flavor2.isFlavorTextType()) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   671
                return -1;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   672
            } else {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   673
                return 0;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   674
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   675
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   676
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   677
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   678
    /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   679
     * A fallback implementation of {@link DesktopDatatransferService} used if
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   680
     * there is no desktop.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   681
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   682
    private static final class DefaultDesktopDatatransferService implements DesktopDatatransferService {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   683
        static final DesktopDatatransferService INSTANCE = getDesktopService();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   684
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   685
        private static DesktopDatatransferService getDesktopService() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   686
            ServiceLoader<DesktopDatatransferService> loader =
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   687
                    ServiceLoader.load(DesktopDatatransferService.class, null);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   688
            Iterator<DesktopDatatransferService> iterator = loader.iterator();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   689
            if (iterator.hasNext()) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   690
                return iterator.next();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   691
            } else {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   692
                return new DefaultDesktopDatatransferService();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   693
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   694
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   695
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   696
        /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   697
         * System singleton FlavorTable. Only used if there is no desktop to
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   698
         * provide an appropriate FlavorMap.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   699
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   700
        private volatile FlavorMap flavorMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   701
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   702
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   703
        public void invokeOnEventThread(Runnable r) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   704
            r.run();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   705
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   706
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   707
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   708
        public String getDefaultUnicodeEncoding() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   709
            return StandardCharsets.UTF_8.name();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   710
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   711
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   712
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   713
        public FlavorMap getFlavorMap(Supplier<FlavorMap> supplier) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   714
            FlavorMap map = flavorMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   715
            if (map == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   716
                synchronized (this) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   717
                    map = flavorMap;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   718
                    if (map == null) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   719
                        flavorMap = map = supplier.get();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   720
                    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   721
                }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   722
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   723
            return map;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   724
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   725
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   726
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   727
        public boolean isDesktopPresent() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   728
            return false;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   729
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   730
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   731
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   732
        public LinkedHashSet<DataFlavor> getPlatformMappingsForNative(String nat) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   733
            return new LinkedHashSet<>();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   734
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   735
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   736
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   737
        public LinkedHashSet<String> getPlatformMappingsForFlavor(DataFlavor df) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   738
            return new LinkedHashSet<>();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   739
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   740
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   741
        @Override
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   742
        public void registerTextFlavorProperties(String nat, String charset,
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   743
                                                 String eoln, String terminators) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   744
            // Not needed if desktop module is absent
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   745
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   746
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   747
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   748
    public static DesktopDatatransferService getDesktopService() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   749
        return DefaultDesktopDatatransferService.INSTANCE;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   750
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   751
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   752
    /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   753
     * A class that provides access to {@code java.rmi.Remote} and
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   754
     * {@code java.rmi.MarshalledObject} without creating a static dependency.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   755
     */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   756
    public static class RMI {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   757
        private static final Class<?> remoteClass = getClass("java.rmi.Remote");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   758
        private static final Class<?> marshallObjectClass = getClass("java.rmi.MarshalledObject");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   759
        private static final Constructor<?> marshallCtor = getConstructor(marshallObjectClass, Object.class);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   760
        private static final Method marshallGet = getMethod(marshallObjectClass, "get");
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   761
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   762
        private static Class<?> getClass(String name) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   763
            try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   764
                return Class.forName(name, true, null);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   765
            } catch (ClassNotFoundException e) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   766
                return null;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   767
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   768
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   769
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   770
        private static Constructor<?> getConstructor(Class<?> c, Class<?>... types) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   771
            try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   772
                return (c == null) ? null : c.getDeclaredConstructor(types);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   773
            } catch (NoSuchMethodException x) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   774
                throw new AssertionError(x);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   775
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   776
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   777
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   778
        private static Method getMethod(Class<?> c, String name, Class<?>... types) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   779
            try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   780
                return (c == null) ? null : c.getMethod(name, types);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   781
            } catch (NoSuchMethodException e) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   782
                throw new AssertionError(e);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   783
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   784
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   785
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   786
        /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   787
         * Returns {@code java.rmi.Remote.class} if RMI is present; otherwise
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   788
         * {@code null}.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   789
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   790
        static Class<?> remoteClass() {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   791
            return remoteClass;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   792
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   793
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   794
        /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   795
         * Returns {@code true} if the given class is java.rmi.Remote.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   796
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   797
        public static boolean isRemote(Class<?> c) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   798
            return (remoteClass != null) && remoteClass.isAssignableFrom(c);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   799
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   800
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   801
        /**
45655
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   802
         * Returns a new MarshalledObject containing the serialized
02c95aa8a53a 8180889: Cleanup of javadoc in java.datatransfer module
serb
parents: 35302
diff changeset
   803
         * representation of the given object.
26010
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   804
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   805
        public static Object newMarshalledObject(Object obj) throws IOException {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   806
            try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   807
                return marshallCtor == null ? null : marshallCtor.newInstance(obj);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   808
            } catch (InstantiationException | IllegalAccessException x) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   809
                throw new AssertionError(x);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   810
            } catch (InvocationTargetException x) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   811
                Throwable cause = x.getCause();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   812
                if (cause instanceof IOException)
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   813
                    throw (IOException) cause;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   814
                throw new AssertionError(x);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   815
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   816
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   817
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   818
        /**
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   819
         * Returns a new copy of the contained marshalled object.
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   820
         */
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   821
        public static Object getMarshalledObject(Object obj)
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   822
                throws IOException, ClassNotFoundException {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   823
            try {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   824
                return marshallGet == null ? null : marshallGet.invoke(obj);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   825
            } catch (IllegalAccessException x) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   826
                throw new AssertionError(x);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   827
            } catch (InvocationTargetException x) {
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   828
                Throwable cause = x.getCause();
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   829
                if (cause instanceof IOException)
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   830
                    throw (IOException) cause;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   831
                if (cause instanceof ClassNotFoundException)
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   832
                    throw (ClassNotFoundException) cause;
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   833
                throw new AssertionError(x);
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   834
            }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   835
        }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   836
    }
9a3cf8ee0776 8037485: Refactor java.awt.datatransfer to eliminate dependency on AWT
pchelko
parents:
diff changeset
   837
}