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(); - } }