package pers.xanadu.enderdragon.maven; import org.bukkit.Bukkit; import org.jetbrains.annotations.TestOnly; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; public class DependencyManager { private static final Set dependency_set = new TreeSet<>(); private static final Logger logger = Bukkit.getLogger(); private static boolean dep_groovy = false; public static void onEnable(){ dependency_set.clear(); List rules = Collections.emptyList(); // List rules = Arrays.asList( // "groovy","xanadu.groovy", // "org.apache.groovy","xanadu.org.apache.groovy" // ); Dependency groovy = new Dependency("org.apache.groovy","groovy","4.0.18","https://repo1.maven.org/maven2/", Dependency.AlgorithmType.SHA_256,rules); boolean f = groovy.load(); if(f) dep_groovy = true; else err("Failed to load library: "+groovy.getName()); //addDependency("org.jetbrains.kotlin","kotlin-stdlib","1.7.20"); //addDependency("com.fasterxml.jackson.core","jackson-databind","2.14.2"); //loadAllDependency(); } @TestOnly private static void loadAllDependency(){ dependency_set.forEach(key->{ String[] splits = key.split("\\$",3); new Dependency(splits[0],splits[1],splits[2]).load(); }); } @TestOnly public static void addDependency(String groupId, String artifactId, String version,String... exclusion){ dependency_set.add(groupId+"$"+artifactId+"$"+version); if(exclusion!=null && exclusion.length!=0 && "*$*".equals(exclusion[0])) return; String pom_url = "https://repo1.maven.org/maven2/" + groupId.replaceAll("\\.", "/") + "/" + artifactId.replaceAll("\\.","/") + "/" + version + "/" + artifactId + "-" + version + ".pom"; String baseDir = "libs\\" + groupId.replaceAll("\\.", "\\\\") + "\\" + artifactId.replaceAll("\\.","\\\\") + "\\" + version; File folder = new File(baseDir); folder.mkdirs(); String filePath = baseDir + "\\" + artifactId + "-" + version + ".pom"; DependencyManager.downloadFile(pom_url,filePath); File file = new File(filePath); try{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(file); Element root = doc.getDocumentElement(); Element dependenciesElement = XMLParser.getElement(root,"dependencies"); if(dependenciesElement == null) return; NodeList dependencyList = dependenciesElement.getElementsByTagName("dependency"); for (int i = 0; i < dependencyList.getLength(); i++) { Element dependencyElement = (Element) dependencyList.item(i); String nxt_groupId = XMLParser.getString(dependencyElement,"groupId"); String nxt_artifactId = XMLParser.getString(dependencyElement,"artifactId"); String nxt_version = XMLParser.getString(dependencyElement,"version"); if(nxt_groupId==null || nxt_artifactId==null || nxt_version==null){ return; } String scope = XMLParser.getString(dependencyElement,"scope"); String optional = XMLParser.getString(dependencyElement,"optional"); //${xxx}如何处理? //获取不到版本怎么办? //if(scope.matches("${}")) if(isRequired(scope,optional)) { String[] nxt_exclusions = getExclusions(dependencyElement); String id = nxt_groupId + "$" + nxt_artifactId; String parent_id = nxt_groupId + "$*"; if(exclusion!=null){ boolean add = true; for(int j=0;j