package com.iailab.netsdk.lib; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.io.InputStream; import java.util.*; /** * @author 47081 * @version 1.0 * @description * @date 2021/3/10 */ public class DynamicParseUtil { private DynamicLibParseHandler handler; private SAXParserFactory saxParserFactory; private SAXParser saxParser; /** * 适é…å„系统动æ€åº“å称大å°å†™ä¸åŒ,以åŠlibå‰ç¼€é€ æˆçš„找ä¸åˆ°åº“的问题 * * @param currentSystem 当å‰ç³»ç»Ÿ:win64,win32,linux64,linux32,mac64 * @param libName 动æ€åº“å称 * @return */ public String compareLibName(String currentSystem, String libName) { String dynamicLibName = libName; List<String> libs = handler.getLibsBySystem(currentSystem); if (currentSystem.toLowerCase().contains("win")) { return findLibs(libs, libName); } if (libName.startsWith("lib")) { dynamicLibName = libName.substring(3); } return findLibs(libs, dynamicLibName); } private String findLibs(List<String> libs, String libName) { for (String lib : libs) { if (libName.equalsIgnoreCase(lib)) { return lib; } } return ""; } public List<String> getLibsSystem(String system) { return handler.getLibsBySystem(system); } private DynamicParseUtil() throws ParserConfigurationException { // 获å–SAX分æžå™¨çš„工厂实例,专门负责创建SAXParser分æžå™¨ saxParserFactory = SAXParserFactory.newInstance(); // 获å–SAXParser分æžå™¨çš„实例 try { saxParser = saxParserFactory.newSAXParser(); handler = new DynamicLibParseHandler(); } catch (Exception e) { e.printStackTrace(); } } public DynamicParseUtil(InputStream inputSteam) throws ParserConfigurationException, IOException, SAXException { this(); saxParser.parse(inputSteam, handler); } /** xml解æžhandler */ private class DynamicLibParseHandler extends DefaultHandler { private HashMap<String, List<String>> dynamics = new HashMap<String, List<String>>(); private List<String> systems = Arrays.asList("win64", "win32", "linux64", "linux32", "mac64", "linuxARM"); private String currentDynamicSystem; private List<String> libs; public List<String> getLibsBySystem(String system) { return dynamics.get(system); } @Override public void startDocument() throws SAXException { super.startDocument(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if (systems.contains(qName)) { currentDynamicSystem = qName; if (libs == null) { libs = new ArrayList<String>(); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if (systems.contains(qName)) { // ä¿å˜åˆ°hashmapä¸ dynamics.put(currentDynamicSystem, libs); // 清除libs libs = null; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String lib = new String(ch, start, length); if (!lib.trim().isEmpty()) { libs.add(lib); } } } }