diff --git a/src/main/java/org/itxtech/mcl/component/Repository.java b/src/main/java/org/itxtech/mcl/component/Repository.java index 8ba707f..0410a5c 100644 --- a/src/main/java/org/itxtech/mcl/component/Repository.java +++ b/src/main/java/org/itxtech/mcl/component/Repository.java @@ -5,6 +5,8 @@ import org.itxtech.mcl.Loader; import org.itxtech.mcl.pkg.MclPackage; import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.XMLConstants; @@ -86,6 +88,7 @@ public PackageInfo fetchPackage(String id) throws Exception { public Document fetchMavenMetadata(String id) throws Exception { for (var repo : loader.config.mavenRepo) { try { + if (httpHead(repo + "/" + transformId(id)+ "/maven-metadata.xml").statusCode() != 200) continue; var content = httpGet("/" + transformId(id) + "/maven-metadata.xml", repo); var factory = DocumentBuilderFactory.newInstance(); factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); @@ -117,11 +120,12 @@ public String getLatestVersionFromMaven(String id, String channel) throws Except } } if (map.size() == 0) { - loader.logger.error("Cannot find any version matches channel \"" + channel + "`\" for \"" + id + "\", using default version."); + loader.logger.error("Cannot find any version matches channel \"" + channel + "\" for \"" + id + "\", using default version."); } else { return map.lastEntry().getValue(); } } + else return data.getElementsByTagName("latest").item(0).getTextContent(); } return data.getElementsByTagName("release").item(0).getTextContent(); } @@ -149,8 +153,17 @@ public String getJarUrl(MclPackage pkg, PackageInfo info) { } } for (var repo : loader.config.mavenRepo) { - var base = repo + "/" + transformId(pkg.id) + "/" + pkg.version + "/" - + getPackageFromId(pkg.id) + "-" + pkg.version; + var baseFolder = repo + "/" + transformId(pkg.id) + "/" + pkg.version + "/"; + var base = baseFolder + getPackageFromId(pkg.id) + "-" + pkg.version; + if (pkg.version.endsWith("-SNAPSHOT")) { + try { + var real = getSnapshotJarUrl(baseFolder, getPackageFromId(pkg.id), pkg.version); + if (!real.isEmpty()) return real; + } catch (Exception e) { + loader.logger.logException(e); + } + continue; + } for (var suf : loader.config.archiveSuffix) { var real = base + suf; try { @@ -165,6 +178,48 @@ public String getJarUrl(MclPackage pkg, PackageInfo info) { return ""; } + private String getSnapshotJarUrl(String baseFolder, String packageName, String packageVersion) throws Exception { + if (httpHead(baseFolder + "maven-metadata.xml").statusCode() != 200) return ""; + var content = httpGet(baseFolder + "maven-metadata.xml", ""); + var factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + var document = factory.newDocumentBuilder().parse(new InputSource(new StringReader(content))); + var elements = document.getElementsByTagName("snapshotVersion"); + var versions = new HashMap(); + for (int i = 0; i < elements.getLength(); i++) { + var version = elements.item(i).getChildNodes(); + var classifier = findNodeValue(version, "classifier", ""); + var extension = findNodeValue(version, "extension", ""); + var value = findNodeValue(version, "value", ""); + var suffix = (classifier.isEmpty() ? "" : ("-" + classifier)) + "." + extension; + + var real = baseFolder + packageName + "-" + value + suffix; + versions.put(suffix, packageName + "-" + packageVersion + suffix + "|" + real); + } + for (var suf : loader.config.archiveSuffix) { + var real = versions.get(suf); + if (real == null) continue; + try { + if (httpHead(real.split("\\|")[1]).statusCode() == 200) { + return real; + } + } catch (Exception e) { + loader.logger.logException(e); + } + } + return ""; + } + + public static String findNodeValue(NodeList nodes, String name, String defValue) { + for (int i = 0; i < nodes.getLength(); i++) { + var node = nodes.item(i); + if (node.getNodeName().equals(name)) { + return node.getTextContent().trim(); + } + } + return defValue; + } + public String getMetadataUrl(MclPackage pkg, PackageInfo info) { if (info != null && info.repo != null) { var repoInfo = info.repo.get(pkg.version); diff --git a/src/main/java/org/itxtech/mcl/module/builtin/Updater.java b/src/main/java/org/itxtech/mcl/module/builtin/Updater.java index 393d943..42ada75 100644 --- a/src/main/java/org/itxtech/mcl/module/builtin/Updater.java +++ b/src/main/java/org/itxtech/mcl/module/builtin/Updater.java @@ -181,9 +181,15 @@ public void downloadFile(MclPackage pack, Repository.PackageInfo info) { ); return; } - var index = jarUrl.lastIndexOf(name); - if (index != -1) { - jar = jarUrl.substring(index); + if (jarUrl.contains("|")) { + var split = jarUrl.split("\\|"); + jar = split[0]; + jarUrl = split[1]; + } else { + var index = jarUrl.lastIndexOf(name); + if (index != -1) { + jar = jarUrl.substring(index); + } } down(jarUrl, new File(dir, jar));