diff --git a/api/src/main/java/fr/atlasworld/network/api/file/FileManager.java b/api/src/main/java/fr/atlasworld/network/api/file/FileManager.java
index 8e9d5f0..1c03e6f 100644
--- a/api/src/main/java/fr/atlasworld/network/api/file/FileManager.java
+++ b/api/src/main/java/fr/atlasworld/network/api/file/FileManager.java
@@ -29,6 +29,22 @@ public interface FileManager {
*/
void registerModuleFile(Module module, File file);
+ /**
+ * Checks if a file is registered.
+ * @see
+ * @param file
+ * @return
+ */
+ boolean isFileRegistered(File file);
+
+ /**
+ * Gets the module registered as the owner of the specified file.
+ *
+ * @param file file to check.
+ * @return owner module of the file.
+ */
+ Module whoIsOwner(File file);
+
/**
* Register a configuration file for a module.
*
diff --git a/api/src/main/java/fr/atlasworld/network/api/file/FileOwner.java b/api/src/main/java/fr/atlasworld/network/api/file/FileOwner.java
new file mode 100644
index 0000000..368f2bc
--- /dev/null
+++ b/api/src/main/java/fr/atlasworld/network/api/file/FileOwner.java
@@ -0,0 +1,27 @@
+package fr.atlasworld.network.api.file;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Member of AtlasNetworks file api, This is not a file system owner!
+ *
+ * FileOwner are used by the cleanup system to prevent deletion of used files or directories.
+ * File can be registered by a module when its activating.
+ * @see fr.atlasworld.network.api.file.FileManager
+ */
+public interface FileOwner {
+
+ /**
+ * Unique ID of the owner, your module ID is being used here.
+ */
+ @NotNull
+ String ownerId();
+
+ /**
+ * Checks if this owner allows other owners to read/write to file registered by him by default.
+ * AtlasNetwork Core System will always have access to the owner's files.
+ */
+ boolean allowsExternalOwnerUsage();
+
+
+}
diff --git a/api/src/main/java/fr/atlasworld/network/api/file/RegisteredFile.java b/api/src/main/java/fr/atlasworld/network/api/file/RegisteredFile.java
new file mode 100644
index 0000000..66b81a5
--- /dev/null
+++ b/api/src/main/java/fr/atlasworld/network/api/file/RegisteredFile.java
@@ -0,0 +1,35 @@
+package fr.atlasworld.network.api.file;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+
+/**
+ * Registered File information.
+ */
+public interface RegisteredFile {
+
+ /**
+ * Retrieve the file owner.
+ * @return null if the file does not have an owner.
+ */
+ @Nullable
+ FileOwner getOwner();
+
+ /**
+ * Get the file.
+ */
+ @NotNull
+ File sourceFile();
+
+ /**
+ * Checks if reading the file is allowed.
+ */
+ boolean readAllowed();
+
+ /**
+ * Checks if writing to the file is allowed.
+ */
+ boolean writeAllowed();
+}
diff --git a/api/src/main/java/fr/atlasworld/network/api/file/configuration/ConfigurationSchema.java b/api/src/main/java/fr/atlasworld/network/api/file/configuration/ConfigurationSchema.java
index f8e842e..71fd4a6 100644
--- a/api/src/main/java/fr/atlasworld/network/api/file/configuration/ConfigurationSchema.java
+++ b/api/src/main/java/fr/atlasworld/network/api/file/configuration/ConfigurationSchema.java
@@ -2,6 +2,8 @@
import com.google.gson.Gson;
import com.google.gson.JsonElement;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* Configuration Schema, sets all the required information for the configuration to work properly.
@@ -13,6 +15,7 @@ public interface ConfigurationSchema {
* Defines the configuration file path inside the {@code configurations/} directory.
* @return configuration file path.
*/
+ @NotNull
String filepath();
/**
@@ -25,6 +28,7 @@ public interface ConfigurationSchema {
* Get the default configuration.
* @return default configuration.
*/
+ @NotNull
T defaultConfiguration();
/**
@@ -32,6 +36,7 @@ public interface ConfigurationSchema {
* Used internally to parse the file.
* @return configuration file class.
*/
+ @NotNull
Class configurationClass();
/**
@@ -49,5 +54,6 @@ public interface ConfigurationSchema {
*
* @return the updated configuration file
*/
+ @Nullable
T updateConfiguration(JsonElement json, Gson gson, int currentVersion);
}
diff --git a/api/src/test/java/fr/atlasworld/network/api/test/configuration/TestConfigurationSchema.java b/api/src/test/java/fr/atlasworld/network/api/test/configuration/TestConfigurationSchema.java
index ba69b72..7e2e66b 100644
--- a/api/src/test/java/fr/atlasworld/network/api/test/configuration/TestConfigurationSchema.java
+++ b/api/src/test/java/fr/atlasworld/network/api/test/configuration/TestConfigurationSchema.java
@@ -3,10 +3,11 @@
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import fr.atlasworld.network.api.file.configuration.ConfigurationSchema;
+import org.jetbrains.annotations.NotNull;
public class TestConfigurationSchema implements ConfigurationSchema {
@Override
- public String filepath() {
+ public @NotNull String filepath() {
return "test_dir/test";
}
@@ -16,12 +17,12 @@ public int configurationVersion() {
}
@Override
- public TestConfiguration defaultConfiguration() {
+ public @NotNull TestConfiguration defaultConfiguration() {
return new TestConfiguration(true);
}
@Override
- public Class configurationClass() {
+ public @NotNull Class configurationClass() {
return TestConfiguration.class;
}
diff --git a/src/main/java/fr/atlasworld/network/core/AtlasNetwork.java b/src/main/java/fr/atlasworld/network/core/AtlasNetwork.java
index b06e9fe..d223b6a 100644
--- a/src/main/java/fr/atlasworld/network/core/AtlasNetwork.java
+++ b/src/main/java/fr/atlasworld/network/core/AtlasNetwork.java
@@ -1,14 +1,25 @@
package fr.atlasworld.network.core;
+import fr.atlasworld.network.api.AtlasNetworkServer;
+import fr.atlasworld.network.api.file.FileManager;
import fr.atlasworld.network.boot.LaunchArgs;
import fr.atlasworld.network.core.module.ModuleManager;
-public class AtlasNetwork {
+public class AtlasNetwork implements AtlasNetworkServer {
+ private final FileManager fileManager;
+
private AtlasNetwork(final LaunchArgs args) {
ModuleManager moduleManager = ModuleManager.init(args);
moduleManager.load();
//Module Manager -> Load Modules -> Done Later once AtlasNetwork is initialized
moduleManager.initialize();
+
+
+ }
+
+ @Override
+ public FileManager getFileManager() {
+ return
}
}
diff --git a/src/main/java/fr/atlasworld/network/core/file/SystemFileManager.java b/src/main/java/fr/atlasworld/network/core/file/SystemFileManager.java
new file mode 100644
index 0000000..17266db
--- /dev/null
+++ b/src/main/java/fr/atlasworld/network/core/file/SystemFileManager.java
@@ -0,0 +1,52 @@
+package fr.atlasworld.network.core.file;
+
+import fr.atlasworld.network.api.file.FileManager;
+import fr.atlasworld.network.api.file.configuration.ConfigurationFile;
+import fr.atlasworld.network.api.file.configuration.ConfigurationReader;
+import fr.atlasworld.network.api.file.configuration.ConfigurationSchema;
+import fr.atlasworld.network.api.file.exception.unchecked.FileRegistrationException;
+import fr.atlasworld.network.api.module.Module;
+import fr.atlasworld.network.boot.LaunchArgs;
+
+import java.io.File;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class SystemFileManager implements FileManager {
+ private final Map registeredFilesMap = new ConcurrentHashMap<>();
+
+ @Override
+ public void registerModuleFile(Module module, File file) throws FileRegistrationException {
+ this.registeredFilesMap.containsKey(file)
+ }
+
+ @Override
+ public ConfigurationReader registerConfiguration(Module module, ConfigurationSchema schema) throws FileRegistrationException {
+ String filename = schema.filepath().endsWith(".json") ? schema.filepath() : schema.filepath() + ".json";
+ File configurationFile = SystemFileManager.getConfigurationFile(filename);
+
+ this.registerModuleFile(module, configurationFile); // Try to register the file
+
+
+ }
+
+ // Static fields
+ public static final File WORKING_DIRECTORY = new File(System.getProperty("user.dir"));
+
+ public static File getDataDirectory() {
+ return LaunchArgs.getArguments().getDataDirectory();
+ }
+
+ public static File getModuleDirectory() {
+ return LaunchArgs.getArguments().getModuleDirectory();
+ }
+
+ public static File getConfigurationDirectory() {
+ return LaunchArgs.getArguments().getConfigurationDirectory();
+ }
+
+ public static File getConfigurationFile(String name) {
+ return new File(getConfigurationDirectory(), name);
+ }
+}
diff --git a/src/main/java/fr/atlasworld/network/core/module/lifecycle/ModuleActivateContextImpl.java b/src/main/java/fr/atlasworld/network/core/module/lifecycle/ModuleActivateContextImpl.java
index e26a371..75d61df 100644
--- a/src/main/java/fr/atlasworld/network/core/module/lifecycle/ModuleActivateContextImpl.java
+++ b/src/main/java/fr/atlasworld/network/core/module/lifecycle/ModuleActivateContextImpl.java
@@ -1,6 +1,17 @@
package fr.atlasworld.network.core.module.lifecycle;
+import fr.atlasworld.network.api.AtlasNetworkServer;
import fr.atlasworld.network.api.module.lifecycle.ModuleActivationContext;
public class ModuleActivateContextImpl implements ModuleActivationContext {
+ private final AtlasNetworkServer server;
+
+ public ModuleActivateContextImpl(AtlasNetworkServer server) {
+ this.server = server;
+ }
+
+ @Override
+ public AtlasNetworkServer getServer() {
+ return this.server;
+ }
}
diff --git a/src/main/java/fr/atlasworld/network/core/util/FileManager.java b/src/main/java/fr/atlasworld/network/core/util/FileManager.java
index 0a1219b..a164c51 100644
--- a/src/main/java/fr/atlasworld/network/core/util/FileManager.java
+++ b/src/main/java/fr/atlasworld/network/core/util/FileManager.java
@@ -5,17 +5,5 @@
import java.io.File;
public class FileManager {
- public static final File WORKING_DIRECTORY = new File(System.getProperty("user.dir"));
- public static File getDataDirectory() {
- return LaunchArgs.getArguments().getDataDirectory();
- }
-
- public static File getModuleDirectory() {
- return LaunchArgs.getArguments().getModuleDirectory();
- }
-
- public static File getConfigurationDirectory() {
- return LaunchArgs.getArguments().getConfigurationDirectory();
- }
}