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 = ""; /** 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' || 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; } }