33import com .fasterxml .jackson .databind .JsonNode ;
44import com .fasterxml .jackson .databind .node .ObjectNode ;
55import java .io .IOException ;
6+ import java .io .InputStream ;
67import java .nio .file .Path ;
78import java .util .regex .Matcher ;
89import java .util .regex .Pattern ;
1112import me .itzg .helpers .json .ObjectMappers ;
1213
1314public class ProvidedInstallerResolver implements InstallerResolver {
15+
1416 private static final Pattern OLD_FORGE_ID_VERSION = Pattern .compile ("forge(.+)" , Pattern .CASE_INSENSITIVE );
17+ public static final String PROP_ID = "id" ;
18+ public static final String PROP_INHERITS_FROM = "inheritsFrom" ;
19+ public static final String INSTALLER_ID_FORGE = "forge" ;
20+ public static final String INSTALLER_ID_CLEANROOM = "cleanroom" ;
1521
1622 private final Path forgeInstaller ;
1723
@@ -31,7 +37,7 @@ public VersionPair resolve() {
3137 throw new GenericException ("Failed to locate version from provided installer file" );
3238 }
3339
34- return new VersionPair ( versions . minecraft , versions . forge ) ;
40+ return versions ;
3541 }
3642
3743 @ Override
@@ -46,22 +52,10 @@ public void cleanup(Path forgeInstallerJar) {
4652
4753 private VersionPair extractVersion (Path forgeInstaller ) throws IOException {
4854
49- // Extract version from installer jar's version.json file
50- // where top level "id" field is used
51-
52- final VersionPair fromVersionJson = IoStreams .readFileFromZip (forgeInstaller , "version.json" , inputStream -> {
53- final ObjectNode parsed = ObjectMappers .defaultMapper ()
54- .readValue (inputStream , ObjectNode .class );
55-
56- final String id = parsed .get ("id" ).asText ("" );
57-
58- final String [] idParts = id .split ("-" );
59- if (idParts .length != 3 || !idParts [1 ].equals ("forge" )) {
60- throw new GenericException ("Unexpected format of id from Forge installer's version.json: " + id );
61- }
62-
63- return new VersionPair (idParts [0 ], idParts [2 ]);
64- });
55+ final VersionPair fromVersionJson = IoStreams .readFileFromZip (forgeInstaller , "version.json" ,
56+ ProvidedInstallerResolver ::extractFromVersionJson
57+ );
58+ // will be null if version.json wasn't present
6559 if (fromVersionJson != null ) {
6660 return fromVersionJson ;
6761 }
@@ -70,7 +64,7 @@ private VersionPair extractVersion(Path forgeInstaller) throws IOException {
7064 final ObjectNode parsed = ObjectMappers .defaultMapper ()
7165 .readValue (inputStream , ObjectNode .class );
7266
73- final JsonNode idNode = parsed .path ("versionInfo" ).path ("id" );
67+ final JsonNode idNode = parsed .path ("versionInfo" ).path (PROP_ID );
7468 if (idNode .isTextual ()) {
7569 final String [] idParts = idNode .asText ().split ("-" );
7670
@@ -100,4 +94,33 @@ private VersionPair extractVersion(Path forgeInstaller) throws IOException {
10094 }
10195 });
10296 }
97+
98+ /**
99+ * Extract version from installer jar's version.json file where top level "id" and "inheritedFrom" fields are used
100+ * @throws GenericException if something wasn't right about the version.json
101+ */
102+ public static VersionPair extractFromVersionJson (InputStream versionJsonIn ) throws IOException {
103+ final ObjectNode parsed = ObjectMappers .defaultMapper ()
104+ .readValue (versionJsonIn , ObjectNode .class );
105+
106+ final String id = parsed .get (PROP_ID ).asText ();
107+ final JsonNode inheritsFromNode = parsed .get (PROP_INHERITS_FROM );
108+ if (inheritsFromNode .isMissingNode ()) {
109+ throw new GenericException ("Installer version.json is missing " + PROP_INHERITS_FROM );
110+ }
111+ final String minecraftVersion = inheritsFromNode .asText ();
112+
113+ final String [] idParts = id .split ("-" );
114+ if (idParts .length >= 3 ) {
115+ if (idParts [1 ].equals (INSTALLER_ID_FORGE )) {
116+ return new VersionPair (minecraftVersion , idParts [2 ]);
117+ }
118+ if (idParts [0 ].equals (INSTALLER_ID_CLEANROOM )) {
119+ return new VersionPair (minecraftVersion , String .join ("-" , idParts [1 ], idParts [2 ]))
120+ .setVariantOverride (INSTALLER_ID_CLEANROOM );
121+ }
122+ }
123+
124+ throw new GenericException ("Unexpected format of id from Forge installer's version.json: " + id );
125+ }
103126}
0 commit comments