src/share/classes/java/awt/datatransfer/SystemFlavorMap.java

Print this page

        

*** 25,34 **** --- 25,36 ---- package java.awt.datatransfer; import java.awt.Toolkit; + import java.io.BufferedInputStream; + import java.io.InputStream; import java.lang.ref.SoftReference; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader;
*** 36,52 **** --- 38,56 ---- import java.net.URL; import java.net.MalformedURLException; import java.util.ArrayList; + import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; + import java.util.Properties; import java.util.Set; import sun.awt.AppContext; import sun.awt.datatransfer.DataTransferer;
*** 208,402 **** private SystemFlavorMap() { } /** ! * Initializes a SystemFlavorMap by reading flavormap.properties and ! * AWT.DnD.flavorMapFileURL. * For thread-safety must be called under lock on this. */ private void initSystemFlavorMap() { if (isMapInitialized) { return; } - isMapInitialized = true; - BufferedReader flavormapDotProperties = - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction<BufferedReader>() { - public BufferedReader run() { - String fileName = - System.getProperty("java.home") + - File.separator + - "lib" + - File.separator + - "flavormap.properties"; - try { - return new BufferedReader - (new InputStreamReader - (new File(fileName).toURI().toURL().openStream(), "ISO-8859-1")); - } catch (MalformedURLException e) { - System.err.println("MalformedURLException:" + e + " while loading default flavormap.properties file:" + fileName); - } catch (IOException e) { - System.err.println("IOException:" + e + " while loading default flavormap.properties file:" + fileName); - } - return null; - } - }); - - String url = - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction<String>() { - public String run() { - return Toolkit.getProperty("AWT.DnD.flavorMapFileURL", null); - } - }); - - if (flavormapDotProperties != null) { - try { - parseAndStoreReader(flavormapDotProperties); - } catch (IOException e) { - System.err.println("IOException:" + e + " while parsing default flavormap.properties file"); - } - } ! BufferedReader flavormapURL = null; ! if (url != null) { ! try { ! flavormapURL = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "ISO-8859-1")); ! } catch (MalformedURLException e) { ! System.err.println("MalformedURLException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); ! } catch (IOException e) { ! System.err.println("IOException:" + e + " while reading AWT.DnD.flavorMapFileURL:" + url); ! } catch (SecurityException e) { ! // ignored ! } } ! if (flavormapURL != null) { ! try { ! parseAndStoreReader(flavormapURL); } catch (IOException e) { ! System.err.println("IOException:" + e + " while parsing AWT.DnD.flavorMapFileURL"); ! } ! } ! } ! /** ! * Copied code from java.util.Properties. Parsing the data ourselves is the ! * only way to handle duplicate keys and values. ! */ ! private void parseAndStoreReader(BufferedReader in) throws IOException { ! while (true) { ! // Get next line ! String line = in.readLine(); ! if (line == null) { ! return; ! } ! ! if (line.length() > 0) { ! // Continue lines that end in slashes if they are not comments ! char firstChar = line.charAt(0); ! if (firstChar != '#' && firstChar != '!') { ! while (continueLine(line)) { ! String nextLine = in.readLine(); ! if (nextLine == null) { ! nextLine = ""; ! } ! String loppedLine = ! line.substring(0, line.length() - 1); ! // Advance beyond whitespace on new line ! int startIndex = 0; ! for(; startIndex < nextLine.length(); startIndex++) { ! if (whiteSpaceChars. ! indexOf(nextLine.charAt(startIndex)) == -1) ! { ! break; ! } ! } ! nextLine = nextLine.substring(startIndex, ! nextLine.length()); ! line = loppedLine+nextLine; ! } ! ! // Find start of key ! int len = line.length(); ! int keyStart = 0; ! for(; keyStart < len; keyStart++) { ! if(whiteSpaceChars. ! indexOf(line.charAt(keyStart)) == -1) { ! break; ! } ! } ! ! // Blank lines are ignored ! if (keyStart == len) { ! continue; ! } ! ! // Find separation between key and value ! int separatorIndex = keyStart; ! for(; separatorIndex < len; separatorIndex++) { ! char currentChar = line.charAt(separatorIndex); ! if (currentChar == '\\') { ! separatorIndex++; ! } else if (keyValueSeparators. ! indexOf(currentChar) != -1) { ! break; ! } ! } ! ! // Skip over whitespace after key if any ! int valueIndex = separatorIndex; ! for (; valueIndex < len; valueIndex++) { ! if (whiteSpaceChars. ! indexOf(line.charAt(valueIndex)) == -1) { ! break; ! } ! } ! ! // Skip over one non whitespace key value separators if any ! if (valueIndex < len) { ! if (strictKeyValueSeparators. ! indexOf(line.charAt(valueIndex)) != -1) { ! valueIndex++; ! } ! } ! ! // Skip over white space after other separators if any ! while (valueIndex < len) { ! if (whiteSpaceChars. ! indexOf(line.charAt(valueIndex)) == -1) { ! break; ! } ! valueIndex++; } ! String key = line.substring(keyStart, separatorIndex); ! String value = (separatorIndex < len) ! ? line.substring(valueIndex, len) ! : ""; ! ! // Convert then store key and value ! key = loadConvert(key); ! value = loadConvert(value); ! try { MimeType mime = new MimeType(value); if ("text".equals(mime.getPrimaryType())) { String charset = mime.getParameter("charset"); ! if (DataTransferer.doesSubtypeSupportCharset ! (mime.getSubType(), charset)) { // We need to store the charset and eoln // parameters, if any, so that the // DataTransferer will have this information // for conversion into the native format. ! DataTransferer transferer = ! DataTransferer.getInstance(); if (transferer != null) { ! transferer.registerTextFlavorProperties ! (key, charset, mime.getParameter("eoln"), mime.getParameter("terminators")); } } --- 212,258 ---- private SystemFlavorMap() { } /** ! * Initializes a SystemFlavorMap by reading flavormap.properties * For thread-safety must be called under lock on this. */ private void initSystemFlavorMap() { if (isMapInitialized) { return; } isMapInitialized = true; ! InputStream is = SystemFlavorMap.class.getResourceAsStream("/sun/awt/datatransfer/flavormap.properties"); ! if (is == null) { ! throw new InternalError("Default flavor mapping not found"); } ! Properties flavorProperties = new Properties(); ! try (BufferedInputStream bis = new BufferedInputStream(is)) { ! flavorProperties.load(bis); } catch (IOException e) { ! System.err.println("Warning reading flavor mapping: " + e.getMessage()); } ! for (String key : flavorProperties.stringPropertyNames()) { ! String[] values = flavorProperties.getProperty(key).split(","); ! for (String value : values) { try { MimeType mime = new MimeType(value); if ("text".equals(mime.getPrimaryType())) { String charset = mime.getParameter("charset"); ! if (DataTransferer.doesSubtypeSupportCharset(mime.getSubType(), charset)) { // We need to store the charset and eoln // parameters, if any, so that the // DataTransferer will have this information // for conversion into the native format. ! DataTransferer transferer = DataTransferer.getInstance(); if (transferer != null) { ! transferer.registerTextFlavorProperties(key, charset, mime.getParameter("eoln"), mime.getParameter("terminators")); } }
*** 440,521 **** store(key, df, getNativeToFlavor()); } } } } - } - - /** - * Copied from java.util.Properties. - */ - private boolean continueLine (String line) { - int slashCount = 0; - int index = line.length() - 1; - while((index >= 0) && (line.charAt(index--) == '\\')) { - slashCount++; - } - return (slashCount % 2 == 1); - } - - /** - * Copied from java.util.Properties. - */ - private String loadConvert(String theString) { - char aChar; - int len = theString.length(); - StringBuilder outBuffer = new StringBuilder(len); - - for (int x = 0; x < len; ) { - aChar = theString.charAt(x++); - if (aChar == '\\') { - aChar = theString.charAt(x++); - if (aChar == 'u') { - // Read the xxxx - int value = 0; - for (int i = 0; i < 4; i++) { - aChar = theString.charAt(x++); - switch (aChar) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { - value = (value << 4) + aChar - '0'; - break; - } - case 'a': case 'b': case 'c': - case 'd': case 'e': case 'f': { - value = (value << 4) + 10 + aChar - 'a'; - break; - } - case 'A': case 'B': case 'C': - case 'D': case 'E': case 'F': { - value = (value << 4) + 10 + aChar - 'A'; - break; - } - default: { - throw new IllegalArgumentException( - "Malformed \\uxxxx encoding."); - } - } - } - outBuffer.append((char)value); - } else { - if (aChar == 't') { - aChar = '\t'; - } else if (aChar == 'r') { - aChar = '\r'; - } else if (aChar == 'n') { - aChar = '\n'; - } else if (aChar == 'f') { - aChar = '\f'; - } - outBuffer.append(aChar); - } - } else { - outBuffer.append(aChar); - } - } - return outBuffer.toString(); - } /** * Stores the listed object under the specified hash key in map. Unlike a * standard map, the listed object will not replace any object already at * the appropriate Map location, but rather will be appended to a List --- 296,305 ----