Skip to content

Commit 97216d3

Browse files
authored
Update to DependencyDownload 2.0.0 and implement cleaning the libraries directory (#4242)
Affects issues: - Close #3438
1 parent 6fb01a0 commit 97216d3

9 files changed

Lines changed: 104 additions & 19 deletions

File tree

Plan/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ subprojects {
8282
slf4jVersion = "2.0.17"
8383
geoIpVersion = "4.3.1"
8484
gsonVersion = "2.13.1"
85-
dependencyDownloadVersion = "1.3.1"
85+
dependencyDownloadVersion = "2.0.0"
8686
ipAddressMatcherVersion = "5.5.1"
8787
jasyptVersion = "1.9.3"
8888

Plan/common/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ dependencies {
5757
implementation "net.playeranalytics:platform-abstraction-layer-api:$palVersion"
5858

5959
compileOnly "net.kyori:adventure-api:$adventureVersion"
60-
implementation("dev.vankka:dependencydownload-runtime:$dependencyDownloadVersion") {
60+
api("dev.vankka:dependencydownload-runtime:$dependencyDownloadVersion") {
6161
// Effectively disables relocating
6262
exclude module: "jar-relocator"
6363
}

Plan/common/src/main/java/com/djrapitops/plan/PlanSystem.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@
3535
import com.djrapitops.plan.utilities.logging.ErrorContext;
3636
import com.djrapitops.plan.utilities.logging.ErrorLogger;
3737
import com.djrapitops.plan.version.VersionChecker;
38+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
3839
import net.playeranalytics.plugin.server.PluginLogger;
3940

4041
import javax.inject.Inject;
4142
import javax.inject.Singleton;
43+
import java.io.IOException;
4244

4345
/**
4446
* PlanSystem contains everything Plan needs to run.
@@ -74,6 +76,7 @@ public class PlanSystem implements SubSystem {
7476
private final ApiServices apiServices;
7577
private final PluginLogger logger;
7678
private final ErrorLogger errorLogger;
79+
private final ApplicationDependencyManager applicationDependencyManager;
7780

7881
@Inject
7982
public PlanSystem(
@@ -93,6 +96,7 @@ public PlanSystem(
9396
DeliveryUtilities deliveryUtilities,
9497
PluginLogger logger,
9598
ErrorLogger errorLogger,
99+
ApplicationDependencyManager applicationDependencyManager,
96100
ApiServices apiServices, // API v5
97101
@SuppressWarnings("deprecation") PlanAPI.PlanAPIHolder apiHolder, GatheringUtilities gatheringUtilities // Deprecated PlanAPI, backwards compatibility
98102
) {
@@ -113,6 +117,7 @@ public PlanSystem(
113117
this.gatheringUtilities = gatheringUtilities;
114118
this.logger = logger;
115119
this.errorLogger = errorLogger;
120+
this.applicationDependencyManager = applicationDependencyManager;
116121
this.apiServices = apiServices;
117122

118123
logger.info("§2");
@@ -192,6 +197,12 @@ public void disable() {
192197

193198
apiServices.disableExtensionDataUpdates();
194199

200+
try {
201+
applicationDependencyManager.cleanupCacheDirectory();
202+
} catch (IOException e) {
203+
logger.warn("Failed to cleanup dependency cache directory", e);
204+
}
205+
195206
disableSystems(
196207
taskSystem,
197208
cacheSystem,

Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/configuration/IpAllowListMatcher.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020
import com.djrapitops.plan.exceptions.LibraryLoadingException;
2121
import com.djrapitops.plan.storage.file.PlanFiles;
2222
import com.djrapitops.plan.utilities.dev.Untrusted;
23+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
2324
import dev.vankka.dependencydownload.DependencyManager;
2425
import dev.vankka.dependencydownload.classloader.IsolatedClassLoader;
25-
import dev.vankka.dependencydownload.repository.StandardRepository;
26+
import dev.vankka.dependencydownload.repository.MavenRepository;
27+
import dev.vankka.dependencydownload.resource.DependencyDownloadResource;
2628
import net.playeranalytics.plugin.server.PluginLogger;
2729

2830
import javax.inject.Inject;
@@ -45,14 +47,21 @@ public class IpAllowListMatcher {
4547
private final PluginLogger logger;
4648
private final PlanFiles files;
4749
private final AddressAllowList addressAllowList;
50+
protected final ApplicationDependencyManager applicationDependencyManager;
4851
private final AtomicBoolean failedDownload = new AtomicBoolean(false);
4952
private ClassLoader libraryClassLoader;
5053

5154
@Inject
52-
public IpAllowListMatcher(PluginLogger logger, PlanFiles files, AddressAllowList addressAllowList) {
55+
public IpAllowListMatcher(
56+
PluginLogger logger,
57+
PlanFiles files,
58+
AddressAllowList addressAllowList,
59+
ApplicationDependencyManager applicationDependencyManager
60+
) {
5361
this.logger = logger;
5462
this.files = files;
5563
this.addressAllowList = addressAllowList;
64+
this.applicationDependencyManager = applicationDependencyManager;
5665
}
5766

5867
public synchronized void prepare() {
@@ -69,18 +78,26 @@ public synchronized void prepare() {
6978
private void downloadLibrary() throws ExecutionException {
7079
if (DOWNLOAD_LIBRARY) {
7180
logger.info("Downloading IP Address parsing library for Allowlist checking, this may take a while...");
72-
DependencyManager dependencyManager = new DependencyManager(files.getDataDirectory().resolve("libraries"));
73-
dependencyManager.loadFromResource(getDependencyResource());
81+
DependencyManager dependencyManager = new DependencyManager(
82+
applicationDependencyManager.getDependencyPathProvider(),
83+
applicationDependencyManager.getLogger()
84+
);
85+
dependencyManager.loadResource(DependencyDownloadResource.parse(getDependencyResource()));
86+
7487
try {
7588
dependencyManager.downloadAll(null, List.of(
76-
new StandardRepository("https://repo1.maven.org/maven2")
89+
new MavenRepository("https://repo1.maven.org/maven2")
7790
)).get();
7891
} catch (InterruptedException e) {
7992
Thread.currentThread().interrupt();
8093
}
8194

8295
IsolatedClassLoader classLoader = new IsolatedClassLoader();
8396
dependencyManager.load(null, classLoader);
97+
98+
// Include this dependency manager in the application dependency manager for library cleaning purposes
99+
applicationDependencyManager.include(dependencyManager);
100+
84101
this.libraryClassLoader = classLoader;
85102
} else {
86103
libraryClassLoader = getClass().getClassLoader();

Plan/common/src/main/java/com/djrapitops/plan/modules/SystemObjectProvidingModule.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,14 @@
3535
import dagger.Module;
3636
import dagger.Provides;
3737
import dagger.multibindings.ElementsIntoSet;
38+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
39+
import dev.vankka.dependencydownload.path.DependencyPathProvider;
3840
import net.playeranalytics.plugin.PluginInformation;
3941

4042
import javax.inject.Named;
4143
import javax.inject.Singleton;
4244
import java.io.File;
45+
import java.nio.file.Path;
4346
import java.util.HashSet;
4447
import java.util.Set;
4548
import java.util.function.Predicate;
@@ -123,4 +126,11 @@ JSONStorage provideJSONStorage(
123126
return new JSONMemoryStorageShim(config, jsonFileStorage);
124127
}
125128

129+
@Provides
130+
@Singleton
131+
ApplicationDependencyManager applicationDependencyManager(@Named("dataFolder") File dataFolder) {
132+
Path librariesDirectory = dataFolder.toPath().resolve("libraries");
133+
return new ApplicationDependencyManager(DependencyPathProvider.directory(librariesDirectory));
134+
}
135+
126136
}

Plan/common/src/main/java/com/djrapitops/plan/storage/database/MySQLDB.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.zaxxer.hikari.HikariDataSource;
3434
import com.zaxxer.hikari.pool.HikariPool;
3535
import dagger.Lazy;
36+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
3637
import net.playeranalytics.plugin.scheduling.RunnableFactory;
3738
import net.playeranalytics.plugin.server.PluginLogger;
3839

@@ -65,9 +66,19 @@ public MySQLDB(
6566
Lazy<ServerInfo> serverInfo,
6667
RunnableFactory runnableFactory,
6768
PluginLogger pluginLogger,
68-
ErrorLogger errorLogger
69+
ErrorLogger errorLogger,
70+
ApplicationDependencyManager applicationDependencyManager
6971
) {
70-
super(() -> serverInfo.get().getServerUUID(), locale, config, files, runnableFactory, pluginLogger, errorLogger);
72+
super(
73+
() -> serverInfo.get().getServerUUID(),
74+
locale,
75+
config,
76+
files,
77+
runnableFactory,
78+
pluginLogger,
79+
errorLogger,
80+
applicationDependencyManager
81+
);
7182
}
7283

7384
private static synchronized void increment() {

Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLDB.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@
3838
import com.djrapitops.plan.utilities.java.ThrowableUtils;
3939
import com.djrapitops.plan.utilities.logging.ErrorContext;
4040
import com.djrapitops.plan.utilities.logging.ErrorLogger;
41+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
4142
import dev.vankka.dependencydownload.DependencyManager;
4243
import dev.vankka.dependencydownload.classloader.IsolatedClassLoader;
44+
import dev.vankka.dependencydownload.repository.MavenRepository;
4345
import dev.vankka.dependencydownload.repository.Repository;
44-
import dev.vankka.dependencydownload.repository.StandardRepository;
46+
import dev.vankka.dependencydownload.resource.DependencyDownloadResource;
4547
import net.playeranalytics.plugin.scheduling.PluginRunnable;
4648
import net.playeranalytics.plugin.scheduling.RunnableFactory;
4749
import net.playeranalytics.plugin.scheduling.TimeAmount;
@@ -67,8 +69,8 @@ public abstract class SQLDB extends AbstractDatabase {
6769
private static boolean downloadDriver = true;
6870

6971
private static final List<Repository> DRIVER_REPOSITORIES = Arrays.asList(
70-
new StandardRepository("https://repo.papermc.io/repository/maven-public"),
71-
new StandardRepository("https://repo1.maven.org/maven2")
72+
new MavenRepository("https://repo.papermc.io/repository/maven-public"),
73+
new MavenRepository("https://repo1.maven.org/maven2")
7274
);
7375

7476
private final Supplier<ServerUUID> serverUUIDSupplier;
@@ -79,6 +81,7 @@ public abstract class SQLDB extends AbstractDatabase {
7981
protected final RunnableFactory runnableFactory;
8082
protected final PluginLogger logger;
8183
protected final ErrorLogger errorLogger;
84+
protected final ApplicationDependencyManager applicationDependencyManager;
8285

8386
protected ClassLoader driverClassLoader;
8487

@@ -97,7 +100,8 @@ protected SQLDB(
97100
PlanFiles files,
98101
RunnableFactory runnableFactory,
99102
PluginLogger logger,
100-
ErrorLogger errorLogger
103+
ErrorLogger errorLogger,
104+
ApplicationDependencyManager applicationDependencyManager
101105
) {
102106
this.serverUUIDSupplier = serverUUIDSupplier;
103107
this.locale = locale;
@@ -106,6 +110,7 @@ protected SQLDB(
106110
this.runnableFactory = runnableFactory;
107111
this.logger = logger;
108112
this.errorLogger = errorLogger;
113+
this.applicationDependencyManager = applicationDependencyManager;
109114

110115
this.transactionExecutorServiceProvider = () -> {
111116
String nameFormat = "Plan " + getClass().getSimpleName() + "-transaction-thread-%d";
@@ -129,8 +134,12 @@ public static void setDownloadDriver(boolean downloadDriver) {
129134

130135
public void downloadDriver() {
131136
if (downloadDriver) {
132-
DependencyManager dependencyManager = new DependencyManager(files.getDataDirectory().resolve("libraries"));
133-
dependencyManager.loadFromResource(getDependencyResource());
137+
DependencyManager dependencyManager = new DependencyManager(
138+
applicationDependencyManager.getDependencyPathProvider(),
139+
applicationDependencyManager.getLogger()
140+
);
141+
dependencyManager.loadResource(DependencyDownloadResource.parse(getDependencyResource()));
142+
134143
try {
135144
dependencyManager.downloadAll(null, DRIVER_REPOSITORIES).get();
136145
} catch (InterruptedException e) {
@@ -141,6 +150,10 @@ public void downloadDriver() {
141150

142151
IsolatedClassLoader classLoader = new IsolatedClassLoader();
143152
dependencyManager.load(null, classLoader);
153+
154+
// Include this dependency manager in the application dependency manager for library cleaning purposes
155+
applicationDependencyManager.include(dependencyManager);
156+
144157
this.driverClassLoader = classLoader;
145158
} else {
146159
this.driverClassLoader = getClass().getClassLoader();

Plan/common/src/main/java/com/djrapitops/plan/storage/database/SQLiteDB.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.djrapitops.plan.utilities.SemaphoreAccessCounter;
2828
import com.djrapitops.plan.utilities.logging.ErrorLogger;
2929
import dagger.Lazy;
30+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
3031
import net.playeranalytics.plugin.scheduling.RunnableFactory;
3132
import net.playeranalytics.plugin.scheduling.Task;
3233
import net.playeranalytics.plugin.server.PluginLogger;
@@ -70,9 +71,19 @@ private SQLiteDB(
7071
Lazy<ServerInfo> serverInfo,
7172
RunnableFactory runnableFactory,
7273
PluginLogger logger,
73-
ErrorLogger errorLogger
74+
ErrorLogger errorLogger,
75+
ApplicationDependencyManager applicationDependencyManager
7476
) {
75-
super(() -> serverInfo.get().getServerUUID(), locale, config, files, runnableFactory, logger, errorLogger);
77+
super(
78+
() -> serverInfo.get().getServerUUID(),
79+
locale,
80+
config,
81+
files,
82+
runnableFactory,
83+
logger,
84+
errorLogger,
85+
applicationDependencyManager
86+
);
7687
dbName = databaseFile.getName();
7788
this.databaseFile = databaseFile;
7889
connectionLock = new SemaphoreAccessCounter();
@@ -240,6 +251,7 @@ public static class Factory {
240251
private final PluginLogger logger;
241252
private final ErrorLogger errorLogger1;
242253
private final PlanFiles files;
254+
private final ApplicationDependencyManager applicationDependencyManager;
243255

244256
@Inject
245257
public Factory(
@@ -249,7 +261,8 @@ public Factory(
249261
Lazy<ServerInfo> serverInfo,
250262
RunnableFactory runnableFactory,
251263
PluginLogger logger,
252-
ErrorLogger errorLogger1
264+
ErrorLogger errorLogger1,
265+
ApplicationDependencyManager applicationDependencyManager
253266
) {
254267
this.locale = locale;
255268
this.config = config;
@@ -258,6 +271,7 @@ public Factory(
258271
this.runnableFactory = runnableFactory;
259272
this.logger = logger;
260273
this.errorLogger1 = errorLogger1;
274+
this.applicationDependencyManager = applicationDependencyManager;
261275
}
262276

263277
public SQLiteDB usingDefaultFile() {
@@ -271,7 +285,8 @@ public SQLiteDB usingFileCalled(String fileName) {
271285
public SQLiteDB usingFile(File databaseFile) {
272286
return new SQLiteDB(databaseFile,
273287
locale, config, files, serverInfo,
274-
runnableFactory, logger, errorLogger1
288+
runnableFactory, logger, errorLogger1,
289+
applicationDependencyManager
275290
);
276291
}
277292

Plan/common/src/test/java/utilities/dagger/TestSystemObjectProvidingModule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.google.gson.Gson;
2828
import dagger.Module;
2929
import dagger.Provides;
30+
import dev.vankka.dependencydownload.ApplicationDependencyManager;
31+
import dev.vankka.dependencydownload.path.DependencyPathProvider;
3032
import utilities.TestErrorLogger;
3133
import utilities.TestResources;
3234

@@ -93,4 +95,10 @@ File provideDataFolder(@Named("tempDir") Path tempDir) {
9395
ErrorLogger provideErrorLogger() {
9496
return new TestErrorLogger();
9597
}
98+
99+
@Provides
100+
@Singleton
101+
ApplicationDependencyManager applicationDependencyManager(@Named("dataFolder") File dataFolder) {
102+
return new ApplicationDependencyManager(DependencyPathProvider.directory(dataFolder.toPath()));
103+
}
96104
}

0 commit comments

Comments
 (0)