|
12 | 12 | import org.elasticsearch.xcontent.ConstructingObjectParser; |
13 | 13 | import org.elasticsearch.xcontent.ParseField; |
14 | 14 |
|
| 15 | +import java.io.IOException; |
| 16 | +import java.io.InputStream; |
| 17 | +import java.io.UncheckedIOException; |
15 | 18 | import java.util.ArrayList; |
16 | 19 | import java.util.Collections; |
17 | 20 | import java.util.HashMap; |
@@ -48,10 +51,23 @@ public class TransportVersionSet { |
48 | 51 | PARSER.declareIntArray(ConstructingObjectParser.constructorArg(), VERSIONS); |
49 | 52 | } |
50 | 53 |
|
51 | | - private static final Map<String, TransportVersionSet> TRANSPORT_VERSION_SETS; |
| 54 | + private static final Map<String, TransportVersionSet> TRANSPORT_VERSION_SETS = loadTransportVersionSets(); |
| 55 | + private static final List<TransportVersion> TRANSPORT_VERSIONS = collectTranportVersions(); |
52 | 56 |
|
53 | | - static { |
| 57 | + private static final String MANIFEST_LOCATION = "META-INF/transport-versions-files-manifest.txt"; |
| 58 | + private static final String METADATA_LOCATION = "org/elasticsearch/transport/"; |
| 59 | + private static final String LATEST_SUFFIX = "-LATEST.json"; |
| 60 | + |
| 61 | + private static Map<String, TransportVersionSet> loadTransportVersionSets() { |
54 | 62 | Map<String, TransportVersionSet> transportVersionSets = new HashMap<>(); |
| 63 | + |
| 64 | + String latestResourceLocation = Version.CURRENT.major + "-" + Version.CURRENT.minor + LATEST_SUFFIX; |
| 65 | + try (InputStream inputStream = TransportVersionSet.class.getResourceAsStream(latestResourceLocation)) { |
| 66 | + |
| 67 | + } catch (IOException ioe) { |
| 68 | + throw new UncheckedIOException(ioe); |
| 69 | + } |
| 70 | + |
55 | 71 | // TODO: load |
56 | 72 | // TODO: TEST ONLY |
57 | 73 | transportVersionSets.put("ml-inference-custom-service-embedding-type", new TransportVersionSet( |
@@ -79,7 +95,18 @@ public class TransportVersionSet { |
79 | 95 | List.of(new TransportVersion(9114000)) |
80 | 96 | )); |
81 | 97 | // TODO: END TEST ONLY |
82 | | - TRANSPORT_VERSION_SETS = Collections.unmodifiableMap(transportVersionSets); |
| 98 | + return Collections.unmodifiableMap(transportVersionSets); |
| 99 | + } |
| 100 | + |
| 101 | + private static List<TransportVersion> collectTranportVersions() { |
| 102 | + List<TransportVersion> tranportVersions = new ArrayList<>(); |
| 103 | + for (TransportVersionSet transportVersionSet : TRANSPORT_VERSION_SETS.values()) { |
| 104 | + for (TransportVersion transportVersion : transportVersionSet.versions) { |
| 105 | + tranportVersions.add(transportVersion); |
| 106 | + } |
| 107 | + } |
| 108 | + tranportVersions.sort(TransportVersion::compareTo); |
| 109 | + return tranportVersions; |
83 | 110 | } |
84 | 111 |
|
85 | 112 | public static TransportVersionSet get(String name) { |
@@ -126,4 +153,75 @@ public boolean isCompatible(TransportVersion version) { |
126 | 153 | public String toString() { |
127 | 154 | return "TransportVersionSet{" + "name='" + name + '\'' + ", versions=" + versions + '}'; |
128 | 155 | } |
| 156 | + |
| 157 | +// private static TransportVersionSet fromJSONInputStream(InputStream inputStream) throws IOException { |
| 158 | +// XContentParser parser = JsonXContent.jsonXContent.createParser(XContentParserConfiguration.EMPTY, inputStream); |
| 159 | +// return TransportVersionSet.fromXContent(parser); |
| 160 | +// } |
| 161 | +// |
| 162 | +// |
| 163 | +// |
| 164 | +// |
| 165 | +// static { |
| 166 | +// var locallyDefinedVersionSets = loadTransportVersionSets(); |
| 167 | +// var extendedVersionSets = new ArrayList<TransportVersionSet>(); // TODO add SPI for serverless |
| 168 | +// |
| 169 | +// var allVersionSets = Stream.concat( |
| 170 | +// locallyDefinedVersionSets.stream(), |
| 171 | +// extendedVersionSets.stream() |
| 172 | +// ).toList(); |
| 173 | +// |
| 174 | +// ALL_VERSIONS_SORTED = allVersionSets.stream().flatMap(tvSet -> tvSet.versions.stream()).sorted().toList(); |
| 175 | +// |
| 176 | +// ALL_VERSIONS_MAP = ALL_VERSIONS_SORTED.stream() |
| 177 | +// .collect(Collectors.toUnmodifiableMap(TransportVersion::id, Function.identity())); |
| 178 | +// |
| 179 | +// ALL_VERSIONS_SETS_MAP = allVersionSets.stream() |
| 180 | +// .collect(Collectors.toUnmodifiableMap(TransportVersionSet::name, Function.identity())); |
| 181 | +// |
| 182 | +// LATEST = getLatestTVSet(); |
| 183 | +// } |
| 184 | +// |
| 185 | +// private static TransportVersionSet getLatestTVSet() { |
| 186 | +// |
| 187 | +// var major = Version.CURRENT.major; |
| 188 | +// var minor = Version.CURRENT.minor; |
| 189 | +// var fileName = major + "." + minor + "-" + LATEST_SUFFIX; |
| 190 | +// |
| 191 | +// var path = METADATA_LOCATION + fileName; |
| 192 | +// return loadTransportVersionSet(path); // todo, use a different format? |
| 193 | +// } |
| 194 | +// |
| 195 | +// private static List<TransportVersionSet> loadTransportVersionSets() { |
| 196 | +// var transportVersionSets = new ArrayList<TransportVersionSet>(); |
| 197 | +// for (var fileName : loadTransportVersionSetFileNames()) { |
| 198 | +// var path = METADATA_LOCATION + fileName; |
| 199 | +// transportVersionSets.add(loadTransportVersionSet(path)); |
| 200 | +// } |
| 201 | +// return transportVersionSets; |
| 202 | +// } |
| 203 | +// |
| 204 | +// // TODO will getResourceAsStream work for IntelliJ? |
| 205 | +// private static List<String> loadTransportVersionSetFileNames() { |
| 206 | +// try (InputStream transportVersionManifest = TransportVersionSet.class.getResourceAsStream(MANIFEST_LOCATION)) { |
| 207 | +// BufferedReader reader = new BufferedReader(new InputStreamReader(transportVersionManifest)); |
| 208 | +// return reader.lines().filter(line -> line.isBlank() == false).toList(); |
| 209 | +// } catch (IOException e) { |
| 210 | +// throw new RuntimeException("Transport version metadata manifest file not found at " + MANIFEST_LOCATION, e); |
| 211 | +// } |
| 212 | +// } |
| 213 | +// |
| 214 | +// private static TransportVersionSet loadTransportVersionSet(String path) { |
| 215 | +// try (var fileStream = VersionsHolder.class.getResourceAsStream(path)) { |
| 216 | +// if (fileStream != null) { |
| 217 | +// return TransportVersionSet.fromJSONInputStream(fileStream); |
| 218 | +// } else { |
| 219 | +// throw new RuntimeException("Input stream is null"); |
| 220 | +// } |
| 221 | +// } catch (IOException e) { |
| 222 | +// throw new RuntimeException("Failed to load TransportVersionSet at path: " + path + |
| 223 | +// " specified in the manifest file: " + MANIFEST_LOCATION, e); |
| 224 | +// } |
| 225 | +// } |
| 226 | +// } |
129 | 227 | } |
0 commit comments