package org.eclipse.jdt.core.internal.tools.unicode; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class TableBuilder { private static final String CHAR_ELEMENT = "char"; //$NON-NLS-1$ private static final String SINCE_UNICODE_VERSION = "age"; //$NON-NLS-1$ private static final String CODE_POINT = "cp"; //$NON-NLS-1$ private static final String GROUP_CODE = "gc"; //$NON-NLS-1$ public static String[] buildTables( final double unicodeValue, boolean usePredefinedRange, Environment env, String unicodeDataFileName) throws IOException { List<String> result = new ArrayList<>(); SAXParser saxParser = null; try { saxParser = SAXParserFactory.newInstance().newSAXParser(); } catch (ParserConfigurationException e) { e.printStackTrace(); return null; } catch (SAXException e) { e.printStackTrace(); return null; } DefaultHandler defaultHandler = new DefaultHandler() { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (CHAR_ELEMENT.equals(qName)) { final String group = attributes.getValue(GROUP_CODE); if (env.hasCategory(group)) { final String codePoint = attributes.getValue(CODE_POINT); final String age = attributes.getValue(SINCE_UNICODE_VERSION); double ageValue = 0.0; try { ageValue = Double.parseDouble(age); } catch (NumberFormatException e) { e.printStackTrace(); } if (ageValue <= unicodeValue) { result.add(codePoint); } } } } }; try { saxParser.parse(new File(unicodeDataFileName), defaultHandler); } catch (SAXException e) { e.printStackTrace(); return null; } if (usePredefinedRange) { // predefined ranges - ISO control character (see // isIdentifierIgnorable(int)) result.add("0000..0008"); //$NON-NLS-1$ result.add("000E..001B"); //$NON-NLS-1$ result.add("007F..009F"); //$NON-NLS-1$ } return result.toArray(new String[result.size()]); } }