File: XmlUtils.java

package info (click to toggle)
gpsprune 19.2-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 4,516 kB
  • sloc: java: 42,704; sh: 25; makefile: 24; python: 15
file content (129 lines) | stat: -rw-r--r-- 3,503 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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;
	}
}