package tim.prune.save.xml;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
/**
* Collection of utility functions for handling XML
*/
public abstract class XmlUtils
{
/** Start of Cdata sequence */
private static final String CDATA_START = "<![CDATA[";
/** End of Cdata sequence */
private static final String CDATA_END = "]]>";
/** Cached copy of system encoding string */
private static String _systemEncoding = null;
/**
* Fix the CDATA blocks in the given String to give valid xml
* @param inString String to modify
* @return fixed String
*/
public static String fixCdata(String inString)
{
if (inString == null || inString.isEmpty()) return "";
if (!hasIllegalCharacter(inString)) {
return inString;
}
String result = inString;
// Remove cdata block at start if present
if (result.startsWith(CDATA_START)) {
result = result.substring(CDATA_START.length());
}
// Remove all instances of end block
result = result.replaceAll(CDATA_END, "");
// Now check whether cdata block is required
if (!hasIllegalCharacter(result)) {
return result;
}
return CDATA_START + result + CDATA_END;
}
/**
* Checks the input string for the three illegal characters,
* but only looping through the string once instead of three times
* @param inValue string to check
* @return true if at least one of the illegal characters is found
*/
public static boolean hasIllegalCharacter(String inValue)
{
if (inValue == null) return false;
final int numChars = inValue.length();
for (int i=0; i<numChars; i++)
{
final char c = inValue.charAt(i);
if (c == '<' || c == '>' || c == '&')
{
return true;
}
}
return false;
}
/**
* @return true if system uses UTF-8 by default
*/
public static boolean isSystemUtf8()
{
String systemEncoding = getSystemEncoding();
return (systemEncoding != null && systemEncoding.toUpperCase().equals("UTF-8"));
}
/**
* @return name of the system's character encoding
*/
public static String getSystemEncoding()
{
if (_systemEncoding == null) {
_systemEncoding = determineSystemEncoding();
}
return _systemEncoding;
}
/**
* Use a temporary file to obtain the name of the default system encoding
* @return name of default system encoding, or null if write failed
*/
private static String determineSystemEncoding()
{
File tempFile = null;
String encoding = null;
try
{
tempFile = File.createTempFile("gpsprune", null);
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(tempFile));
encoding = getEncoding(writer);
writer.close();
}
catch (IOException e) {} // value stays null
// Delete temp file
if (tempFile != null && tempFile.exists()) {
if (!tempFile.delete()) {
System.err.println("Cannot delete temp file: " + tempFile.getAbsolutePath());
}
}
// If writing failed (eg permissions) then just ask system for default
if (encoding == null) encoding = Charset.defaultCharset().name();
return encoding;
}
/**
* Get the default system encoding using a writer
* @param inWriter writer object
* @return string defining encoding
*/
public static String getEncoding(OutputStreamWriter inWriter)
{
String encoding = inWriter.getEncoding();
try {
encoding = Charset.forName(encoding).name();
}
catch (Exception e) {} // ignore failure to find encoding
return encoding;
}
}