/*
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2007 Kazutoshi Satoda
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.io;
//{{{ Imports
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Arrays;
import org.gjt.sp.jedit.jEdit;
import org.gjt.sp.jedit.ServiceManager;
//}}}
/**
* A class for some static methods to deal with encodings.
*
* @since 4.3pre10
* @author Kazutoshi Satoda
*/
public class EncodingServer
{
//{{{ getEncoding() method
/**
* Returns an instance of Encoding for specified name.
* The name is used for search the following domains in the
* listed order.
* - java.nio.charset.Charset
* - jEdit ServiceManager
*/
public static Encoding getEncoding(String name)
{
try
{
return new CharsetEncoding(name);
}
catch (IllegalCharsetNameException e)
{
// just failed
}
catch (UnsupportedCharsetException e)
{
// just failed
}
Object namedService = ServiceManager.getService(serviceClass, name);
if (namedService != null && namedService instanceof Encoding)
{
return (Encoding)namedService;
}
// UnsupportedCharsetException is for java.nio.charset,
// but throw this here too so that this can be caught as
// an encoding error by catch clause for general I/O code.
throw new UnsupportedCharsetException("No such encoding: \"" + name + "\"");
} //}}}
//{{{ getAvailableNames() method
/**
* Returns the set of all available encoding names.
*/
public static Set<String> getAvailableNames()
{
Set<String> set = new HashSet<String>();
set.addAll(Charset.availableCharsets().keySet());
set.addAll(Arrays.asList(ServiceManager.getServiceNames(serviceClass)));
return set;
} //}}}
//{{{ getSelectedNames() method
/**
* Returns the set of user selected encoding names.
*/
public static Set<String> getSelectedNames()
{
Set<String> set = getAvailableNames();
Iterator<String> i = set.iterator();
while (i.hasNext())
{
String name = i.next();
if (jEdit.getBooleanProperty("encoding.opt-out." + name, false))
{
i.remove();
}
}
return set;
} //}}}
//{{{ getTextReader() method
/**
* Returns a Reader object that reads the InputStream with
* the encoding. This method is same with
* "getEncoding(encoding).getTextReader(in)".
*/
public static Reader getTextReader(InputStream in, String encoding)
throws IOException
{
return getEncoding(encoding).getTextReader(in);
} //}}}
//{{{ getTextWriter() method
/**
* Returns a Writer object that writes to the OutputStream with
* the encoding. This method is same with
* "getEncoding(encoding).getTextWriter(out)".
*/
public static Writer getTextWriter(OutputStream out, String encoding)
throws IOException
{
return getEncoding(encoding).getTextWriter(out);
} //}}}
//{{{ hasEncoding() method
/**
* Returns if the specified name is supported as a name for an Encoding.
*/
public static boolean hasEncoding(String name)
{
try
{
if (Charset.isSupported(name))
{
return true;
}
}
catch (IllegalCharsetNameException e)
{
// The name is illegal for java.nio.charset.Charset.
// But it may be legal for service name.
}
return Arrays.asList(ServiceManager.getServiceNames(serviceClass)).contains(name);
} //}}}
//{{{ Private members
private static final String serviceClass = "org.gjt.sp.jedit.io.Encoding";
//}}}
}