From bec734b64c997cc8c210ae6243f1baf518ede10f Mon Sep 17 00:00:00 2001 From: Xavier Fontanet Date: Wed, 12 Oct 2022 11:39:31 +0200 Subject: [PATCH] ConfigFileLoader RE-DESIGN: Split into two parts, common settings and specific project ones, by inheritance and generics for the project's settings Enum --- .gitignore | 3 +- .../config/CommonConfigFileLoader.java | 65 +++++++++++++++ .../tv/mangrana/config/ConfigFileLoader.java | 65 --------------- .../plex/url/PlexCommandLauncher.java | 39 +++++---- .../plex/url/PlexLibrarySectionsResolver.java | 10 +-- .../api/client/gateway/RadarrApiGateway.java | 12 +-- .../api/client/gateway/SonarrApiGateway.java | 12 +-- .../utils/schema/ClientSchemaGenerator.java | 83 ------------------- 8 files changed, 103 insertions(+), 186 deletions(-) create mode 100644 src/main/java/tv/mangrana/config/CommonConfigFileLoader.java delete mode 100644 src/main/java/tv/mangrana/config/ConfigFileLoader.java delete mode 100644 src/main/java/tv/mangrana/utils/schema/ClientSchemaGenerator.java diff --git a/.gitignore b/.gitignore index 981c582..d04752f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ -/target/ \ No newline at end of file +/target/ +.DS_Store \ No newline at end of file diff --git a/src/main/java/tv/mangrana/config/CommonConfigFileLoader.java b/src/main/java/tv/mangrana/config/CommonConfigFileLoader.java new file mode 100644 index 0000000..ce6a1a2 --- /dev/null +++ b/src/main/java/tv/mangrana/config/CommonConfigFileLoader.java @@ -0,0 +1,65 @@ +package tv.mangrana.config; + +import tv.mangrana.exception.IncorrectWorkingReferencesException; +import tv.mangrana.utils.yml.FakeYmlLoader; + +import java.io.File; +import java.util.EnumMap; + +public abstract class CommonConfigFileLoader

> { + + private static final String CONFIG_FOLDER = "/config"; + + public enum CommonProjectConfiguration { + RADARR_API_KEY, + RADARR_API_HOST, + SONARR_API_KEY, + SONARR_API_HOST, + PLEX_TOKEN, + PLEX_HOST, + PLEX_SECTIONS_LIST_URI, + PLEX_SECTION_REFRESH_URI, + SONARR_PATHS_STARTER, + PLEX_PATHS_STARTER + } + private EnumMap commonConfigurationsMap; + + private final Class

projectConfigEnumType; + private EnumMap configurationsMap; + + + public CommonConfigFileLoader(Class

projectConfigEnumType) throws IncorrectWorkingReferencesException { + this.projectConfigEnumType = projectConfigEnumType; + loadAllConfigFromFile(false); + } + public CommonConfigFileLoader

refresh() throws IncorrectWorkingReferencesException { + return loadAllConfigFromFile(true); + } + + private CommonConfigFileLoader

loadAllConfigFromFile(boolean silently) throws IncorrectWorkingReferencesException { + commonConfigurationsMap = new EnumMap<>(CommonProjectConfiguration.class); + commonConfigurationsMap.putAll( loadFromFile(CommonProjectConfiguration.class, silently) ); + + configurationsMap = new EnumMap<>(projectConfigEnumType); + configurationsMap.putAll( loadFromFile(projectConfigEnumType, silently) ); + + return this; + } + + private > EnumMap loadFromFile(Class enumType, boolean silently) throws IncorrectWorkingReferencesException { + File configFile = new File(System.getProperty("user.dir") + + CONFIG_FOLDER.concat("/").concat(getConfigFileName())); + + return FakeYmlLoader.getEnumMapFromFile(configFile, enumType, silently); + } + + public String getConfig(P key) { + return configurationsMap.get(key); + } + public String getCommonConfig(CommonProjectConfiguration key) { + return commonConfigurationsMap.get(key); + } + + protected abstract String getConfigFileName(); + +} diff --git a/src/main/java/tv/mangrana/config/ConfigFileLoader.java b/src/main/java/tv/mangrana/config/ConfigFileLoader.java deleted file mode 100644 index 4a215a6..0000000 --- a/src/main/java/tv/mangrana/config/ConfigFileLoader.java +++ /dev/null @@ -1,65 +0,0 @@ -package tv.mangrana.config; - -import tv.mangrana.exception.IncorrectWorkingReferencesException; -import tv.mangrana.utils.yml.FakeYmlLoader; - -import java.io.File; -import java.util.EnumMap; - -public class ConfigFileLoader { - - private static final String CONFIG_FOLDER = "/config"; - private static final String CONFIG_FILE = "AfterDownloadCarerConfig.yml"; - - public enum ProjectConfiguration { - MANAGE_FAILED_DOWNLOADS, - IMMORTAL_PROCESS, - GRABBED_FILE_IDENTIFIER_REGEX, - RADARR_API_KEY, - RADARR_API_HOST, - SONARR_API_KEY, - SONARR_API_HOST, - DOWNLOADS_TEAM_DRIVE_ID, - DOWNLOADS_SERIES_FOLDER_ID, - MOVIES_TEAM_DRIVE_ID, - SERIES_TEAM_DRIVE_ID, - PLEX_TOKEN, - PLEX_HOST, - PLEX_SECTIONS_LIST_URI, - PLEX_SECTION_REFRESH_URI, - GOOGLE_RETRY_INTERVAL, - SONARR_RETRY_INTERVAL, - RADARR_RETRY_INTERVAL, - SONARR_PATHS_STARTER, - PLEX_PATHS_STARTER - } - - private EnumMap configurationsMap; - - public ConfigFileLoader() throws IncorrectWorkingReferencesException { - loadFromFile(false); - } - private ConfigFileLoader(boolean silently) throws IncorrectWorkingReferencesException { - loadFromFile(silently); - } - public ConfigFileLoader refresh() throws IncorrectWorkingReferencesException { - return loadFromFile(true); - } - public static ConfigFileLoader getFreshConfig() throws IncorrectWorkingReferencesException { - return new ConfigFileLoader(true); - } - - private ConfigFileLoader loadFromFile(boolean silently) throws IncorrectWorkingReferencesException { - File configFile = new File(System.getProperty("user.dir") - + CONFIG_FOLDER.concat("/").concat(CONFIG_FILE)); - - configurationsMap = FakeYmlLoader.getEnumMapFromFile(configFile, ProjectConfiguration.class, silently); - - return this; - } - - public String getConfig(ProjectConfiguration key) { - return configurationsMap.get(key); - } - -} diff --git a/src/main/java/tv/mangrana/plex/url/PlexCommandLauncher.java b/src/main/java/tv/mangrana/plex/url/PlexCommandLauncher.java index af74ce3..2c8016e 100644 --- a/src/main/java/tv/mangrana/plex/url/PlexCommandLauncher.java +++ b/src/main/java/tv/mangrana/plex/url/PlexCommandLauncher.java @@ -1,8 +1,5 @@ package tv.mangrana.plex.url; -import tv.mangrana.config.ConfigFileLoader; -import tv.mangrana.exception.IncorrectWorkingReferencesException; -import tv.mangrana.utils.EasyLogger; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; @@ -11,6 +8,8 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.w3c.dom.Document; import org.xml.sax.SAXException; +import tv.mangrana.config.CommonConfigFileLoader; +import tv.mangrana.utils.EasyLogger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -22,26 +21,26 @@ import java.net.URISyntaxException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.*; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.*; import static tv.mangrana.utils.Output.log; import static tv.mangrana.utils.rest.APIInterface.ProtocolURLMark.HTTPS; public class PlexCommandLauncher { private final EasyLogger logger; - private final ConfigFileLoader config; + private final CommonConfigFileLoader config; private final PlexLibrarySectionsResolver sectionResolver; - public PlexCommandLauncher(ConfigFileLoader config) { + public PlexCommandLauncher(CommonConfigFileLoader config) { this.config = config; this.logger = new EasyLogger(); this.sectionResolver = new PlexLibrarySectionsResolver(this, config); } - public static void main(String[] args) throws IncorrectWorkingReferencesException { - String toRefresh="/tv/Series/C/City on a Hill (2019)"; - new PlexCommandLauncher(new ConfigFileLoader()).scanByPath(toRefresh); - } +// public static void main(String[] args) throws IncorrectWorkingReferencesException { +// String toRefresh="/tv/Series/C/City on a Hill (2019)"; +// new PlexCommandLauncher(new CommonConfigFileLoader()).scanByPath(toRefresh); +// } public void scanByPath(String fullDestinationPath) { String plexPathToRefresh = getPlexUrlPath2Refresh(fullDestinationPath); @@ -51,11 +50,11 @@ public class PlexCommandLauncher { HttpUriRequest httpGET = RequestBuilder.get() .setUri(new URI(plexRefreshURL)) .addParameter("path", plexPathToRefresh) - .addParameter("X-Plex-Token", config.getConfig(PLEX_TOKEN)) + .addParameter("X-Plex-Token", config.getCommonConfig(PLEX_TOKEN)) .build(); httpclient.execute(httpGET); @SuppressWarnings("unused") - String urlWithTokenHidden = httpGET.getURI().toString().replaceFirst(config.getConfig(PLEX_TOKEN), "__plex_token__"); + String urlWithTokenHidden = httpGET.getURI().toString().replaceFirst(config.getCommonConfig(PLEX_TOKEN), "__plex_token__"); logger.nLog("Launched URL command: {0}", httpGET.getURI().toString()); } catch (Exception e) { logger.nHLog("Some error has happened using the URL <{0}>", plexRefreshURL); @@ -64,10 +63,10 @@ public class PlexCommandLauncher { } public String getPlexUrlPath2Refresh(String fullDestinationPath) { - Pattern p = Pattern.compile(config.getConfig(SONARR_PATHS_STARTER).concat("(.+/.+ \\(\\d{4}\\))")); + Pattern p = Pattern.compile(config.getCommonConfig(SONARR_PATHS_STARTER).concat("(.+/.+ \\(\\d{4}\\))")); Matcher m = p.matcher(fullDestinationPath); if (m.find()) { - String pathInPlexDockerStart = config.getConfig(PLEX_PATHS_STARTER); + String pathInPlexDockerStart = config.getCommonConfig(PLEX_PATHS_STARTER); return pathInPlexDockerStart.concat(m.group(1)); } return null; @@ -77,7 +76,7 @@ public class PlexCommandLauncher { try (CloseableHttpClient httpclient = HttpClients.createDefault()) { HttpUriRequest httpGET = RequestBuilder.get() .setUri(new URI(getPlexSectionsURL())) - .addParameter("X-Plex-Token", config.getConfig(PLEX_TOKEN)) + .addParameter("X-Plex-Token", config.getCommonConfig(PLEX_TOKEN)) .build(); try (CloseableHttpResponse httpResponse = httpclient.execute(httpGET)) { final HttpEntity entity = httpResponse.getEntity(); @@ -91,7 +90,7 @@ public class PlexCommandLauncher { } } } - log("launched url command: "+httpGET.getURI().toString().replaceFirst(config.getConfig(PLEX_TOKEN), "__plex_token__")); + log("launched url command: "+httpGET.getURI().toString().replaceFirst(config.getCommonConfig(PLEX_TOKEN), "__plex_token__")); } catch (URISyntaxException | IOException e) { log("could not refresh plex artist because of "+e.getMessage()); e.printStackTrace(); @@ -102,15 +101,15 @@ public class PlexCommandLauncher { private String getPlexRefreshURL(String fullDestinationPath) { String sectionId = sectionResolver.resolveSectionByPath(fullDestinationPath); if (sectionId==null) return null; - String host = config.getConfig(PLEX_HOST); - String uriFormat = config.getConfig(PLEX_SECTION_REFRESH_URI); + String host = config.getCommonConfig(PLEX_HOST); + String uriFormat = config.getCommonConfig(PLEX_SECTION_REFRESH_URI); String uri = uriFormat.replaceFirst("\\{section_id}", sectionId); return HTTPS.getMark() + host + uri; } private String getPlexSectionsURL() { - String host = HTTPS.getMark() + config.getConfig(PLEX_HOST); - String uri = config.getConfig(PLEX_SECTIONS_LIST_URI); + String host = HTTPS.getMark() + config.getCommonConfig(PLEX_HOST); + String uri = config.getCommonConfig(PLEX_SECTIONS_LIST_URI); return host + uri; } diff --git a/src/main/java/tv/mangrana/plex/url/PlexLibrarySectionsResolver.java b/src/main/java/tv/mangrana/plex/url/PlexLibrarySectionsResolver.java index c0dcc85..6e3b4db 100644 --- a/src/main/java/tv/mangrana/plex/url/PlexLibrarySectionsResolver.java +++ b/src/main/java/tv/mangrana/plex/url/PlexLibrarySectionsResolver.java @@ -1,7 +1,7 @@ package tv.mangrana.plex.url; -import tv.mangrana.config.ConfigFileLoader; +import tv.mangrana.config.CommonConfigFileLoader; import tv.mangrana.utils.Output; import com.sun.org.apache.xerces.internal.dom.DeferredElementImpl; import org.w3c.dom.Document; @@ -13,20 +13,20 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.PLEX_PATHS_STARTER; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.PLEX_PATHS_STARTER; public class PlexLibrarySectionsResolver { private final PlexCommandLauncher commandLauncher; - private final ConfigFileLoader config; + private final CommonConfigFileLoader config; - public PlexLibrarySectionsResolver(PlexCommandLauncher commandLauncher, ConfigFileLoader config) { + public PlexLibrarySectionsResolver(PlexCommandLauncher commandLauncher, CommonConfigFileLoader config) { this.commandLauncher = commandLauncher; this.config = config; } public String resolveSectionByPath(String fullDestinationPath) { - final String plexPathStarter = config.getConfig(PLEX_PATHS_STARTER); + final String plexPathStarter = config.getCommonConfig(PLEX_PATHS_STARTER); String keyFolder = fullDestinationPath.replaceFirst(plexPathStarter,"").split("/")[1]; Document xmlDocument = commandLauncher.retrieveSectionsInfo(); XPath xPath = XPathFactory.newInstance().newXPath(); diff --git a/src/main/java/tv/mangrana/radarr/api/client/gateway/RadarrApiGateway.java b/src/main/java/tv/mangrana/radarr/api/client/gateway/RadarrApiGateway.java index ba26b52..483016e 100644 --- a/src/main/java/tv/mangrana/radarr/api/client/gateway/RadarrApiGateway.java +++ b/src/main/java/tv/mangrana/radarr/api/client/gateway/RadarrApiGateway.java @@ -1,13 +1,13 @@ package tv.mangrana.radarr.api.client.gateway; -import tv.mangrana.config.ConfigFileLoader; +import tv.mangrana.config.CommonConfigFileLoader; import tv.mangrana.radarr.api.schema.command.RefreshMoviesCommand; import tv.mangrana.radarr.api.schema.movie.MovieResource; import tv.mangrana.radarr.api.schema.queue.QueueResourcePagingResource; import tv.mangrana.utils.rest.APIProxyBuilderSingleton; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.RADARR_API_HOST; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.RADARR_API_KEY; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.RADARR_API_HOST; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.RADARR_API_KEY; import static tv.mangrana.utils.Output.log; public class RadarrApiGateway { @@ -15,9 +15,9 @@ public class RadarrApiGateway { private final String apiKey; private final RadarrAPIInterface proxy; - public RadarrApiGateway(ConfigFileLoader config) { - apiKey = config.getConfig(RADARR_API_KEY); - proxy = APIProxyBuilderSingleton.getRadarrInterface(config.getConfig(RADARR_API_HOST)); + public RadarrApiGateway(CommonConfigFileLoader config) { + apiKey = config.getCommonConfig(RADARR_API_KEY); + proxy = APIProxyBuilderSingleton.getRadarrInterface(config.getCommonConfig(RADARR_API_HOST)); } public QueueResourcePagingResource getQueue() { diff --git a/src/main/java/tv/mangrana/sonarr/api/client/gateway/SonarrApiGateway.java b/src/main/java/tv/mangrana/sonarr/api/client/gateway/SonarrApiGateway.java index 7264a97..b6c693e 100644 --- a/src/main/java/tv/mangrana/sonarr/api/client/gateway/SonarrApiGateway.java +++ b/src/main/java/tv/mangrana/sonarr/api/client/gateway/SonarrApiGateway.java @@ -1,6 +1,6 @@ package tv.mangrana.sonarr.api.client.gateway; -import tv.mangrana.config.ConfigFileLoader; +import tv.mangrana.config.CommonConfigFileLoader; import tv.mangrana.sonarr.api.schema.command.RefreshSerieCommand; import tv.mangrana.sonarr.api.schema.history.SonarrHistory; import tv.mangrana.sonarr.api.schema.queue.SonarrQueue; @@ -9,8 +9,8 @@ import tv.mangrana.utils.EasyLogger; import tv.mangrana.utils.Output; import tv.mangrana.utils.rest.APIProxyBuilderSingleton; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.SONARR_API_HOST; -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.SONARR_API_KEY; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.SONARR_API_HOST; +import static tv.mangrana.config.CommonConfigFileLoader.CommonProjectConfiguration.SONARR_API_KEY; public class SonarrApiGateway { @@ -18,9 +18,9 @@ public class SonarrApiGateway { private final SonarrAPIInterface proxy; private final EasyLogger logger; - public SonarrApiGateway(ConfigFileLoader config) { - apiKey = config.getConfig(SONARR_API_KEY); - proxy = APIProxyBuilderSingleton.getSonarrInterface(config.getConfig(SONARR_API_HOST)); + public SonarrApiGateway(CommonConfigFileLoader config) { + apiKey = config.getCommonConfig(SONARR_API_KEY); + proxy = APIProxyBuilderSingleton.getSonarrInterface(config.getCommonConfig(SONARR_API_HOST)); logger = new EasyLogger(); } diff --git a/src/main/java/tv/mangrana/utils/schema/ClientSchemaGenerator.java b/src/main/java/tv/mangrana/utils/schema/ClientSchemaGenerator.java deleted file mode 100644 index ab78cd3..0000000 --- a/src/main/java/tv/mangrana/utils/schema/ClientSchemaGenerator.java +++ /dev/null @@ -1,83 +0,0 @@ -package tv.mangrana.utils.schema; - -import tv.mangrana.config.ConfigFileLoader; -import tv.mangrana.exception.IncorrectWorkingReferencesException; - -import java.io.IOException; - -import static tv.mangrana.config.ConfigFileLoader.ProjectConfiguration.*; -import static tv.mangrana.utils.rest.APIInterface.ProtocolURLMark.HTTPS; - -/** - * @deprecated Once the generated classes for client schema are located in the project, this utility is not needed anymore - */ -@Deprecated -public class ClientSchemaGenerator { - - ConfigFileLoader configFileLoader; - - private ClientSchemaGenerator() throws IncorrectWorkingReferencesException { - configFileLoader = new ConfigFileLoader(); - } - - public static void main(String[] args) throws IncorrectWorkingReferencesException, IOException { - new ClientSchemaGenerator().generateRadarrMovieClientSchema(); - } - - @SuppressWarnings("unused") - private void generateRadarrQueueClientSchema() throws IOException { - generate( - configFileLoader.getConfig(RADARR_API_HOST), - "/api/v3/queue?includeMovie=true?apikey=", - configFileLoader.getConfig(RADARR_API_KEY), - "tv.mangrana.radarr.api.schema.queue", - "QueueResourcePagingResource"); - } - - @SuppressWarnings("unused") - private void generateRadarrMovieClientSchema() throws IOException { - generate( - configFileLoader.getConfig(RADARR_API_HOST), - "/api/v3/movie/9216?apikey=", - configFileLoader.getConfig(RADARR_API_KEY), - "tv.mangrana.radarr.api.schema.movie", - "MovieResource"); - } - - @SuppressWarnings("unused") - private void generateSonarrQueueClientSchema() throws IOException { - generate( - configFileLoader.getConfig(SONARR_API_HOST), - "/api/v3/queue?apikey=", - configFileLoader.getConfig(SONARR_API_KEY), - "tv.mangrana.sonarr.api.schema.queue", - "SonarrQueue"); - } - - @SuppressWarnings("unused") - private void generateSonarrSeriesClientSchema() throws IOException { - generate( - configFileLoader.getConfig(SONARR_API_HOST), - "/api/v3/series/2220?apikey=", - configFileLoader.getConfig(SONARR_API_KEY), - "tv.mangrana.sonarr.api.schema.series", - "SonarrSeries"); - } - - @SuppressWarnings("unused") - private void generateSonarrHistoryClientSchema() throws IOException { - generate( - configFileLoader.getConfig(SONARR_API_HOST), - "/api/v3/history?sortKey=date&apikey=", - configFileLoader.getConfig(SONARR_API_KEY), - "tv.mangrana.sonarr.api.schema.history", - "SonarrHistory"); - } - - private void generate(String host, String uri, String apiKey, String pckg, String className) throws IOException { - String schemaUrl = HTTPS.getMark()+host.concat(uri.concat(apiKey)); - ClassGeneratorFromJson generatorFromJson = new ClassGeneratorFromJson(); - generatorFromJson.generateSchema(schemaUrl, pckg, className); - } - -}