From c2a0a550057b5edafbb5736a1a3e3fd2ac304129 Mon Sep 17 00:00:00 2001 From: lionsoul2014 Date: Fri, 12 Dec 2025 11:50:05 +0800 Subject: [PATCH] config build from xdb path and File supports --- .../org/lionsoul/ip2region/SearcherTest.java | 6 +-- .../lionsoul/ip2region/service/Config.java | 19 ++++---- .../ip2region/service/ConfigBuilder.java | 48 ++++++++++++++++--- .../service/InvalidCachePolicyException.java | 11 ----- .../service/InvalidConfigException.java | 7 +++ .../lionsoul/ip2region/service/Ip2Region.java | 20 +++++--- .../ip2region/service/SearcherPool.java | 2 +- .../ip2region/service/ConfigTest.java | 4 +- .../ip2region/service/Ip2RegionTest.java | 10 ++-- 9 files changed, 83 insertions(+), 44 deletions(-) delete mode 100644 binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidCachePolicyException.java create mode 100644 binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidConfigException.java diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/SearcherTest.java b/binding/java/src/main/java/org/lionsoul/ip2region/SearcherTest.java index 279160f..33506f9 100644 --- a/binding/java/src/main/java/org/lionsoul/ip2region/SearcherTest.java +++ b/binding/java/src/main/java/org/lionsoul/ip2region/SearcherTest.java @@ -7,7 +7,7 @@ package org.lionsoul.ip2region; import org.lionsoul.ip2region.service.Config; -import org.lionsoul.ip2region.service.InvalidCachePolicyException; +import org.lionsoul.ip2region.service.InvalidConfigException; import org.lionsoul.ip2region.service.Ip2Region; import org.lionsoul.ip2region.xdb.InetAddressException; import org.lionsoul.ip2region.xdb.XdbException; @@ -49,7 +49,7 @@ public class SearcherTest { } public static final Ip2Region createService( - String v4XdbPath, String v4CachePolicy, String v6XdbPath, String v6CachePolicy) throws IOException, XdbException, InvalidCachePolicyException { + String v4XdbPath, String v4CachePolicy, String v6XdbPath, String v6CachePolicy) throws IOException, XdbException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.cachePolicyFromName(v4CachePolicy)) .setSearchers(1) @@ -89,7 +89,7 @@ public class SearcherTest { } } - public static void searchTest(String[] args) throws IOException, XdbException, InvalidCachePolicyException, InterruptedException { + public static void searchTest(String[] args) throws IOException, XdbException, InterruptedException, InvalidConfigException { String help = ""; String v4DbPath = "", v4CachePolicy = "vectorIndex"; String v6DbPath = "", v6CachePolicy = "vectorIndex"; diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/Config.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/Config.java index 8e8388b..1e4fbb3 100644 --- a/binding/java/src/main/java/org/lionsoul/ip2region/service/Config.java +++ b/binding/java/src/main/java/org/lionsoul/ip2region/service/Config.java @@ -4,6 +4,7 @@ package org.lionsoul.ip2region.service; +import java.io.File; import java.io.IOException; import org.lionsoul.ip2region.xdb.Header; @@ -27,7 +28,7 @@ public class Config { public final Version ipVersion; // xdb file path - public final String xdbPath; + public final File xdbFile; public final Header header; public final byte[] vIndex; @@ -40,21 +41,21 @@ public class Config { return new ConfigBuilder(); } - protected Config(int cachePolicy, Version ipVersion, String xdbPath, + protected Config(int cachePolicy, Version ipVersion, File xdbFile, Header header, byte[] vIndex, LongByteArray cBuffer, int searchers) throws IOException, XdbException { this.cachePolicy = cachePolicy; this.ipVersion = ipVersion; - this.xdbPath = xdbPath; - this.header = header; - this.vIndex = vIndex; + this.xdbFile = xdbFile; + this.header = header; + this.vIndex = vIndex; this.cBuffer = cBuffer; final Version xVersion = Version.fromHeader(header); // verify the ip version (ipVersion and the version of the xdb file should be the same) if (header.ipVersion != ipVersion.id) { throw new XdbException("ip verison not match: xdb file " - + xdbPath + " (" + xVersion.name + "), as " + ipVersion.name + " expected"); + + xdbFile.getAbsolutePath() + " (" + xVersion.name + "), as " + ipVersion.name + " expected"); } this.searchers = searchers; @@ -65,7 +66,7 @@ public class Config { sb.append('{'); sb.append("cache_policy:").append(cachePolicy).append(','); sb.append("version:").append(ipVersion.toString()).append(','); - sb.append("xdb_path:").append(xdbPath).append(','); + sb.append("xdb_path:").append(xdbFile.getAbsolutePath()).append(','); sb.append("header:").append(header.toString()).append(','); if (vIndex == null) { sb.append("v_index: null, "); @@ -82,7 +83,7 @@ public class Config { return sb.toString(); } - public static final int cachePolicyFromName(String name) throws InvalidCachePolicyException { + public static final int cachePolicyFromName(String name) throws InvalidConfigException { final String lName = name.toLowerCase(); if (lName.equals("file") || lName.equals("nocache")) { return NoCache; @@ -91,7 +92,7 @@ public class Config { } else if (lName.equals("content") || lName.equals("buffercache")) { return BufferCache; } else { - throw new InvalidCachePolicyException("invalid cache policy `" + name + "`"); + throw new InvalidConfigException("invalid cache policy `" + name + "`"); } } } \ No newline at end of file diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/ConfigBuilder.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/ConfigBuilder.java index dd838bd..7ffbd53 100644 --- a/binding/java/src/main/java/org/lionsoul/ip2region/service/ConfigBuilder.java +++ b/binding/java/src/main/java/org/lionsoul/ip2region/service/ConfigBuilder.java @@ -4,7 +4,9 @@ package org.lionsoul.ip2region.service; +import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.RandomAccessFile; import org.lionsoul.ip2region.xdb.Header; @@ -23,8 +25,11 @@ public class ConfigBuilder { // cache policy private int cachePolicy = Config.VIndexCache; - // xdb file path + // xdb file path / Object / InputStream. + // Priority: InputStream -> File Object -> String path private String xdbPath = null; + private File xdbFile = null; + private InputStream xdbInputStream = null; // searchers private int searchers = 20; @@ -45,14 +50,45 @@ public class ConfigBuilder { return this; } + public ConfigBuilder setXdbFile(File xdbFile) { + this.xdbFile = xdbFile; + return this; + } + + public ConfigBuilder setXdbInputStream(InputStream xdbInputStream) { + this.xdbInputStream = xdbInputStream; + return this; + } + public ConfigBuilder setSearchers(int searchers) { this.searchers = searchers; return this; } - private Config build(Version ipVersion) throws IOException, XdbException { + private Config build(Version ipVersion) throws IOException, XdbException, InvalidConfigException { + if (xdbInputStream == null) { + // everyting is fine + } else if (cachePolicy != Config.BufferCache) { + // @Note: we can't directly rewrite the cachePolicy to Config.BufferCache. + // you must know what you are doing. + throw new InvalidConfigException("SetXdbInputStream could ONLY be used with cachePolicy = Config.BufferCache"); + } else { + + // return new Config(cachePolicy, ipVersion, null, header, null, cBuffer, searchers); + return null; + } + // load the header and the cache buffer - final RandomAccessFile raf = new RandomAccessFile(xdbPath, "r"); + final File xdbFile; + if (this.xdbFile != null) { + xdbFile = this.xdbFile; + } else if (this.xdbPath != null) { + xdbFile = new File(this.xdbPath); + } else { + throw new InvalidConfigException("Both xdbFile and xdbPath is null"); + } + + final RandomAccessFile raf = new RandomAccessFile(xdbFile, "r"); // 1, verify the xdb Searcher.verify(raf); @@ -67,16 +103,16 @@ public class ConfigBuilder { final LongByteArray cBuffer = cachePolicy == Config.BufferCache ? Searcher.loadContent(raf) : null; raf.close(); - return new Config(cachePolicy, ipVersion, xdbPath, header, vIndex, cBuffer, searchers); + return new Config(cachePolicy, ipVersion, xdbFile, header, vIndex, cBuffer, searchers); } // build the final #Config instance for IPv4 - public Config asV4() throws IOException, XdbException { + public Config asV4() throws IOException, XdbException, InvalidConfigException { return build(Version.IPv4); } // build the final #Config instance for IPv6 - public Config asV6() throws IOException, XdbException { + public Config asV6() throws IOException, XdbException, InvalidConfigException { return build(Version.IPv6); } diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidCachePolicyException.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidCachePolicyException.java deleted file mode 100644 index 348e58f..0000000 --- a/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidCachePolicyException.java +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2022 The Ip2Region Authors. All rights reserved. -// Use of this source code is governed by a Apache2.0-style -// license that can be found in the LICENSE file. - -package org.lionsoul.ip2region.service; - -public class InvalidCachePolicyException extends Exception { - public InvalidCachePolicyException(String str) { - super(str); - } -} diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidConfigException.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidConfigException.java new file mode 100644 index 0000000..a46a00c --- /dev/null +++ b/binding/java/src/main/java/org/lionsoul/ip2region/service/InvalidConfigException.java @@ -0,0 +1,7 @@ +package org.lionsoul.ip2region.service; + +public class InvalidConfigException extends Exception { + public InvalidConfigException(String str) { + super(str); + } +} diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/Ip2Region.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/Ip2Region.java index a6fc03a..d55073b 100644 --- a/binding/java/src/main/java/org/lionsoul/ip2region/service/Ip2Region.java +++ b/binding/java/src/main/java/org/lionsoul/ip2region/service/Ip2Region.java @@ -4,6 +4,7 @@ package org.lionsoul.ip2region.service; +import java.io.File; import java.io.IOException; import org.lionsoul.ip2region.xdb.InetAddressException; @@ -37,23 +38,28 @@ public class Ip2Region { return new Ip2Region(v4Config, v6Config).init(); } - public static final Ip2Region create(final String v4XdbPath, final String v6XdbPath) throws IOException, XdbException { - return new Ip2Region(v4XdbPath, v6XdbPath).init(); + public static final Ip2Region create(final String v4XdbPath, final String v6XdbPath) throws IOException, XdbException, InvalidConfigException { + return new Ip2Region(new File(v4XdbPath), new File(v6XdbPath)).init(); + } + + public static final Ip2Region create(final File v4XdbFile, final File v6XdbFile) throws IOException, XdbException, InvalidConfigException { + return new Ip2Region(v4XdbFile, v6XdbFile).init(); } /** * init the ip2reigon with two xdb file path and default cachePolicy vIndex. * set it to null to disabled the search for specified version * - * @param v4XdbPath - * @param v6XdbPath + * @param v4XdbFile + * @param v6XdbFile * @throws XdbException * @throws IOException + * @throws InvalidConfigException */ - protected Ip2Region(String v4XdbPath, String v6XdbPath) throws IOException, XdbException { + protected Ip2Region(File v4XdbFile, File v6XdbFile) throws IOException, XdbException, InvalidConfigException { this( - v4XdbPath == null ? null : Config.custom().setXdbPath(v4XdbPath).asV4(), - v6XdbPath == null ? null : Config.custom().setXdbPath(v6XdbPath).asV6() + v4XdbFile == null ? null : Config.custom().setXdbFile(v4XdbFile).asV4(), + v6XdbFile == null ? null : Config.custom().setXdbFile(v6XdbFile).asV6() ); } diff --git a/binding/java/src/main/java/org/lionsoul/ip2region/service/SearcherPool.java b/binding/java/src/main/java/org/lionsoul/ip2region/service/SearcherPool.java index 48c7473..aa97e00 100644 --- a/binding/java/src/main/java/org/lionsoul/ip2region/service/SearcherPool.java +++ b/binding/java/src/main/java/org/lionsoul/ip2region/service/SearcherPool.java @@ -60,7 +60,7 @@ public class SearcherPool { protected SearcherPool init() throws IOException { // create the searchers for (int i = pool.size(); i < config.searchers; i++) { - final Searcher searcher = new Searcher(config.ipVersion, config.xdbPath, config.vIndex, config.cBuffer); + final Searcher searcher = new Searcher(config.ipVersion, config.xdbFile, config.vIndex, config.cBuffer); pool.add(searcher); } diff --git a/binding/java/src/test/java/org/lionsoul/ip2region/service/ConfigTest.java b/binding/java/src/test/java/org/lionsoul/ip2region/service/ConfigTest.java index 56a5b66..c716139 100644 --- a/binding/java/src/test/java/org/lionsoul/ip2region/service/ConfigTest.java +++ b/binding/java/src/test/java/org/lionsoul/ip2region/service/ConfigTest.java @@ -21,7 +21,7 @@ public class ConfigTest { } @Test - public void testBuildV4Config() throws IOException, XdbException { + public void testBuildV4Config() throws IOException, XdbException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.BufferCache) .setXdbPath(getDataPath("ip2region_v4.xdb")) @@ -31,7 +31,7 @@ public class ConfigTest { } @Test - public void testBuildV6Config() throws IOException, XdbException { + public void testBuildV6Config() throws IOException, XdbException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.VIndexCache) .setXdbPath(getDataPath("ip2region_v6.xdb")) diff --git a/binding/java/src/test/java/org/lionsoul/ip2region/service/Ip2RegionTest.java b/binding/java/src/test/java/org/lionsoul/ip2region/service/Ip2RegionTest.java index d0fcab7..d78829d 100644 --- a/binding/java/src/test/java/org/lionsoul/ip2region/service/Ip2RegionTest.java +++ b/binding/java/src/test/java/org/lionsoul/ip2region/service/Ip2RegionTest.java @@ -17,7 +17,7 @@ public class Ip2RegionTest { private static final Log log = Log.getLogger(Ip2RegionTest.class).setLevel(Log.DEBUG); @Test - public void TestConfigCreate() throws IOException, XdbException, InetAddressException, InterruptedException { + public void TestConfigCreate() throws IOException, XdbException, InetAddressException, InterruptedException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.NoCache) .setSearchers(10) @@ -46,7 +46,7 @@ public class Ip2RegionTest { } @Test - public void TestPathCreate() throws InetAddressException, IOException, XdbException, InterruptedException { + public void TestPathCreate() throws InetAddressException, IOException, XdbException, InterruptedException, InvalidConfigException { byte[] v4Bytes = Util.parseIP("113.92.157.29"); byte[] v6Bytes = Util.parseIP("240e:3b7:3272:d8d0:db09:c067:8d59:539e"); final Ip2Region ip2Region = Ip2Region.create(ConfigTest.getDataPath("ip2region_v4.xdb"), ConfigTest.getDataPath("ip2region_v6.xdb")); @@ -63,7 +63,7 @@ public class Ip2RegionTest { } @Test - public void TestInMemSearch() throws IOException, XdbException, InetAddressException, InterruptedException { + public void TestInMemSearch() throws IOException, XdbException, InetAddressException, InterruptedException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.BufferCache) .setXdbPath(ConfigTest.getDataPath("ip2region_v4.xdb")) @@ -90,7 +90,7 @@ public class Ip2RegionTest { } @Test - public void TestConcurrentCall() throws IOException, XdbException, InetAddressException, InterruptedException { + public void TestConcurrentCall() throws IOException, XdbException, InetAddressException, InterruptedException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.VIndexCache) .setSearchers(15) @@ -144,7 +144,7 @@ public class Ip2RegionTest { } @Test - public void TestV4Only() throws IOException, XdbException, InetAddressException, InterruptedException { + public void TestV4Only() throws IOException, XdbException, InetAddressException, InterruptedException, InvalidConfigException { final Config v4Config = Config.custom() .setCachePolicy(Config.NoCache) .setXdbPath(ConfigTest.getDataPath("ip2region_v4.xdb"))