/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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, ALIASES); String baseCharsetName = canonicalName.substring(NAME_PREFIX.length()); Charset baseCharset = null; try { baseCharset = Charset.forName(baseCharsetName); } catch (IllegalCharsetNameException e) { //ignore } catch(UnsupportedCharsetException e){ //ignore } myBaseCharset = baseCharset == null ? Charset.forName(DEFAULT_ENCODING_NAME) : baseCharset; } @Override public String displayName() { return getBaseCharset().displayName(); } @Override public boolean contains(Charset cs) { return false; } @Override public CharsetDecoder newDecoder() { return new Native2AsciiCharsetDecoder(this); } @Override public CharsetEncoder newEncoder() { return new Native2AsciiCharsetEncoder(this); } public Charset getBaseCharset() { return myBaseCharset; } public static String makeNative2AsciiEncodingName(String baseCharsetName) { if (baseCharsetName == null) baseCharsetName = DEFAULT_ENCODING_NAME; return NAME_PREFIX + baseCharsetName; } public static Charset forName(String charsetName) { if (charsetName.startsWith(NAME_PREFIX)) { 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 forName(NAME_PREFIX + baseCharset.name()); } public static Charset nativeToBaseCharset(Charset charset) { if (charset instanceof Native2AsciiCharset) { return ((Native2AsciiCharset)charset).getBaseCharset(); } return charset; } private static final ConcurrentMap<String, Native2AsciiCharset> cache = new ConcurrentHashMap<String, Native2AsciiCharset>(); }