diff --git a/platform/boot/src/com/intellij/lang/properties/charset/Native2AsciiCharset.java b/platform/boot/src/com/intellij/lang/properties/charset/Native2AsciiCharset.java index eb980e9fad01..59673af1e965 100644 --- a/platform/boot/src/com/intellij/lang/properties/charset/Native2AsciiCharset.java +++ b/platform/boot/src/com/intellij/lang/properties/charset/Native2AsciiCharset.java @@ -17,18 +17,21 @@ package com.intellij.lang.properties.charset; import java.nio.charset.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * @author Alexey */ public class Native2AsciiCharset extends Charset { + private static final String[] ALIASES = new String[0]; private final Charset myBaseCharset; @SuppressWarnings({"HardCodedStringLiteral"}) private static final String NAME_PREFIX = "NATIVE_TO_ASCII_"; @SuppressWarnings({"HardCodedStringLiteral"}) private static final String DEFAULT_ENCODING_NAME = "ISO-8859-1"; private Native2AsciiCharset(String canonicalName) { - super(canonicalName, null); + super(canonicalName, ALIASES); String baseCharsetName = canonicalName.substring(NAME_PREFIX.length()); Charset baseCharset = null; try { @@ -70,14 +73,21 @@ public class Native2AsciiCharset extends Charset { if (baseCharsetName == null) baseCharsetName = DEFAULT_ENCODING_NAME; return NAME_PREFIX + baseCharsetName; } + public static Charset forName(String charsetName) { if (charsetName.startsWith(NAME_PREFIX)) { - return new Native2AsciiCharset(charsetName); + Native2AsciiCharset cached = cache.get(charsetName); + if (cached == null) { + cached = new Native2AsciiCharset(charsetName); + Native2AsciiCharset prev = cache.putIfAbsent(charsetName, cached); + if (prev != null) cached = prev; + } + return cached; } return null; } public static Charset wrap(Charset baseCharset) { - return new Native2AsciiCharset(NAME_PREFIX + baseCharset.name()); + return forName(NAME_PREFIX + baseCharset.name()); } public static Charset nativeToBaseCharset(Charset charset) { @@ -86,4 +96,6 @@ public class Native2AsciiCharset extends Charset { } return charset; } + + private static final ConcurrentMap cache = new ConcurrentHashMap(); } \ No newline at end of file