diff --git a/src/fr/devinsy/statoolinfos/core/StatoolInfos.java b/src/fr/devinsy/statoolinfos/app/StatoolInfosApp.java similarity index 98% rename from src/fr/devinsy/statoolinfos/core/StatoolInfos.java rename to src/fr/devinsy/statoolinfos/app/StatoolInfosApp.java index 4f4dce2..53d8a94 100644 --- a/src/fr/devinsy/statoolinfos/core/StatoolInfos.java +++ b/src/fr/devinsy/statoolinfos/app/StatoolInfosApp.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Affero General Public License * along with StatoolInfos. If not, see . */ -package fr.devinsy.statoolinfos.core; +package fr.devinsy.statoolinfos.app; import java.io.File; import java.io.IOException; @@ -28,8 +28,13 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.devinsy.statoolinfos.HtmlizerContext; import fr.devinsy.statoolinfos.build.Builder; +import fr.devinsy.statoolinfos.core.BotFilter; +import fr.devinsy.statoolinfos.core.Configuration; +import fr.devinsy.statoolinfos.core.Factory; +import fr.devinsy.statoolinfos.core.Federation; +import fr.devinsy.statoolinfos.core.StatoolInfosContext; +import fr.devinsy.statoolinfos.core.StatoolInfosException; import fr.devinsy.statoolinfos.crawl.Crawler; import fr.devinsy.statoolinfos.metrics.Prober; import fr.devinsy.statoolinfos.metrics.httpaccess.HttpAccessLog; @@ -53,11 +58,11 @@ import fr.devinsy.strings.StringList; import fr.devinsy.strings.StringsUtils; /** - * The Class StatoolInfos. + * The Class StatoolInfosApp. */ -public class StatoolInfos +public class StatoolInfosApp { - private static Logger logger = LoggerFactory.getLogger(StatoolInfos.class); + private static Logger logger = LoggerFactory.getLogger(StatoolInfosApp.class); /** * Builds the. @@ -182,10 +187,6 @@ public class StatoolInfos { exception.printStackTrace(); } - catch (IOException exception) - { - exception.printStackTrace(); - } } /** @@ -242,10 +243,6 @@ public class StatoolInfos { exception.printStackTrace(); } - catch (IOException exception) - { - exception.printStackTrace(); - } } /** @@ -1156,11 +1153,11 @@ public class StatoolInfos */ public static void uptime(final File configurationFile) throws StatoolInfosException, IOException { - HtmlizerContext.instance().configure(configurationFile); + StatoolInfosContext context = new StatoolInfosContext(configurationFile); - UptimeJournal journal = HtmlizerContext.instance().getUptimeJournal(); - Federation federation = HtmlizerContext.instance().getFederation(); + UptimeJournal journal = context.getUptimeJournal(); + Federation federation = context.getFederation(); UptimeSurveyor.survey(journal, federation.getURLActiveAll()); - HtmlizerContext.instance().getCache().storeUptimeJournal(journal); + context.getCache().storeUptimeJournal(journal); } } diff --git a/src/fr/devinsy/statoolinfos/cli/StatoolInfosCLI.java b/src/fr/devinsy/statoolinfos/cli/StatoolInfosCLI.java index bbecbdb..6bee7ba 100644 --- a/src/fr/devinsy/statoolinfos/cli/StatoolInfosCLI.java +++ b/src/fr/devinsy/statoolinfos/cli/StatoolInfosCLI.java @@ -26,8 +26,8 @@ import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import fr.devinsy.statoolinfos.app.StatoolInfosApp; import fr.devinsy.statoolinfos.core.BotFilter; -import fr.devinsy.statoolinfos.core.StatoolInfos; import fr.devinsy.statoolinfos.util.BuildInformation; import fr.devinsy.statoolinfos.util.Chrono; import fr.devinsy.statoolinfos.util.Files; @@ -249,7 +249,7 @@ public final class StatoolInfosCLI File configurationFile = new File(StringUtils.trim(args[1])); try { - StatoolInfos.build(configurationFile); + StatoolInfosApp.build(configurationFile); } catch (Exception exception) { @@ -261,7 +261,7 @@ public final class StatoolInfosCLI File configurationFile = new File(StringUtils.trim(args[1])); try { - StatoolInfos.clear(configurationFile); + StatoolInfosApp.clear(configurationFile); } catch (Exception exception) { @@ -275,7 +275,7 @@ public final class StatoolInfosCLI File configurationFile = new File(StringUtils.trim(args[1])); try { - StatoolInfos.crawl(configurationFile); + StatoolInfosApp.crawl(configurationFile); } catch (Exception exception) { @@ -291,7 +291,7 @@ public final class StatoolInfosCLI { try { - StatoolInfos.format(input); + StatoolInfosApp.format(input); } catch (Exception exception) { @@ -305,13 +305,13 @@ public final class StatoolInfosCLI BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.listIps(configurationFile, filter); + StatoolInfosApp.listIps(configurationFile, filter); } else if (CLIUtils.isMatching(args, "list", "ip", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listIps(configurationFile, BotFilter.ALL); + StatoolInfosApp.listIps(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "list", "ip", "(-all|-bot|-nobot)", ".+")) { @@ -322,7 +322,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listIps(source, filter); + StatoolInfosApp.listIps(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "list", "ip", ".+")) { @@ -332,13 +332,13 @@ public final class StatoolInfosCLI files.add(new File(args[source])); } - StatoolInfos.listIps(files, BotFilter.ALL); + StatoolInfosApp.listIps(files, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "list", "(file|files)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listAccessFiles(configurationFile); + StatoolInfosApp.listAccessFiles(configurationFile); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(file|files)", ".+")) { @@ -348,13 +348,13 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listAccessFiles(source); + StatoolInfosApp.listAccessFiles(source); } else if (CLIUtils.isMatching(args, "list", "(errfile|errfiles)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listErrorFiles(configurationFile); + StatoolInfosApp.listErrorFiles(configurationFile); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(errfile|errfiles)", ".+")) { @@ -364,20 +364,20 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listErrorFiles(source); + StatoolInfosApp.listErrorFiles(source); } else if (CLIUtils.isMatching(args, "list", "(log|logs)", "(-all|-bot|-nobot)", ".+\\.conf*")) { BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.listLogs(configurationFile, filter); + StatoolInfosApp.listLogs(configurationFile, filter); } else if (CLIUtils.isMatching(args, "list", "(log|logs)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listLogs(configurationFile, BotFilter.ALL); + StatoolInfosApp.listLogs(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(log|logs)", "(-all|-bot|-nobot)", ".+")) { @@ -388,7 +388,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listLogs(source, filter); + StatoolInfosApp.listLogs(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(log|logs)", ".+")) { @@ -398,13 +398,13 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listLogs(source, BotFilter.ALL); + StatoolInfosApp.listLogs(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "list", "(errlog|errlogs)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listErrorLogs(configurationFile); + StatoolInfosApp.listErrorLogs(configurationFile); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(errlog|errlogs)", ".+")) { @@ -414,20 +414,20 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listErrorLogs(source); + StatoolInfosApp.listErrorLogs(source); } else if (CLIUtils.isMatching(args, "list", "(useragent|ua)", "(-all|-bot|-nobot)", ".+\\.conf*")) { BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.listUserAgents(configurationFile, filter); + StatoolInfosApp.listUserAgents(configurationFile, filter); } else if (CLIUtils.isMatching(args, "list", "(useragent|ua)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listUserAgents(configurationFile, BotFilter.ALL); + StatoolInfosApp.listUserAgents(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(useragent|ua)", "(-all|-bot|-nobot)", ".+")) { @@ -438,7 +438,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listUserAgents(source, filter); + StatoolInfosApp.listUserAgents(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(useragent|ua)", ".+")) { @@ -448,20 +448,20 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listUserAgents(source, BotFilter.ALL); + StatoolInfosApp.listUserAgents(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "list", "(visitor|visitors)", "(-all|-bot|-nobot)", ".+\\.conf*")) { BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.listVisitors(configurationFile, filter); + StatoolInfosApp.listVisitors(configurationFile, filter); } else if (CLIUtils.isMatching(args, "list", "(visitor|visitors)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.listVisitors(configurationFile, BotFilter.ALL); + StatoolInfosApp.listVisitors(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(visitor|visitors)", "(-all|-bot|-nobot)", ".+")) { @@ -472,7 +472,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listVisitors(source, filter); + StatoolInfosApp.listVisitors(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "list", "(visitor|visitors)", ".+")) { @@ -482,7 +482,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.listVisitors(source, BotFilter.ALL); + StatoolInfosApp.listVisitors(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "probe", "(-full|-today|-previousday|-\\d+)", ".+")) { @@ -521,7 +521,7 @@ public final class StatoolInfosCLI try { System.out.println("Probing [" + input + "] with day count filter " + dayCountFilter); - StatoolInfos.probe(input, dayCountFilter); + StatoolInfosApp.probe(input, dayCountFilter); } catch (Exception exception) { @@ -542,13 +542,13 @@ public final class StatoolInfosCLI BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.statIps(configurationFile, filter); + StatoolInfosApp.statIps(configurationFile, filter); } else if (CLIUtils.isMatching(args, "stat", "ip", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.statIps(configurationFile, BotFilter.ALL); + StatoolInfosApp.statIps(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "ip", "(-all|-bot|-nobot)", ".+")) { @@ -559,7 +559,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statIps(source, filter); + StatoolInfosApp.statIps(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "ip", ".+")) { @@ -569,20 +569,20 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statIps(source, BotFilter.ALL); + StatoolInfosApp.statIps(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "stat", "(useragent|ua)", "(-all|-bot|-nobot)", ".+\\.conf*")) { BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.statUserAgents(configurationFile, filter); + StatoolInfosApp.statUserAgents(configurationFile, filter); } else if (CLIUtils.isMatching(args, "stat", "(useragent|ua)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.statUserAgents(configurationFile, BotFilter.ALL); + StatoolInfosApp.statUserAgents(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "(useragent|ua)", "(-all|-bot|-nobot)", ".+")) { @@ -593,7 +593,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statUserAgents(source, filter); + StatoolInfosApp.statUserAgents(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "(useragent|ua)", ".+")) { @@ -603,20 +603,20 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statUserAgents(source, BotFilter.ALL); + StatoolInfosApp.statUserAgents(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "stat", "(visitor|visitors)", "(-all|-bot|-nobot)", ".+\\.conf*")) { BotFilter filter = parseLogFilterOption(args[2]); File configurationFile = new File(StringUtils.trim(args[3])); - StatoolInfos.statVisitors(configurationFile, filter); + StatoolInfosApp.statVisitors(configurationFile, filter); } else if (CLIUtils.isMatching(args, "stat", "(visitor|visitors)", ".+\\.conf")) { File configurationFile = new File(StringUtils.trim(args[2])); - StatoolInfos.statVisitors(configurationFile, BotFilter.ALL); + StatoolInfosApp.statVisitors(configurationFile, BotFilter.ALL); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "(visitor|visitors)", "(-all|-bot|-nobot)", ".+")) { @@ -627,7 +627,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statVisitors(source, filter); + StatoolInfosApp.statVisitors(source, filter); } else if (CLIUtils.isMatchingEllipsis(args, "stat", "(visitor|visitors)", ".+")) { @@ -637,7 +637,7 @@ public final class StatoolInfosCLI source.add(new File(args[index])); } - StatoolInfos.statVisitors(source, BotFilter.ALL); + StatoolInfosApp.statVisitors(source, BotFilter.ALL); } else if (CLIUtils.isMatching(args, "tagdate", ".+")) { @@ -646,7 +646,7 @@ public final class StatoolInfosCLI { try { - StatoolInfos.tagDate(input); + StatoolInfosApp.tagDate(input); } catch (Exception exception) { @@ -662,7 +662,7 @@ public final class StatoolInfosCLI File configurationFile = new File(StringUtils.trim(args[1])); try { - StatoolInfos.uptime(configurationFile); + StatoolInfosApp.uptime(configurationFile); } catch (Exception exception) { diff --git a/src/fr/devinsy/statoolinfos/core/Configuration.java b/src/fr/devinsy/statoolinfos/core/Configuration.java index df5951a..6912c68 100644 --- a/src/fr/devinsy/statoolinfos/core/Configuration.java +++ b/src/fr/devinsy/statoolinfos/core/Configuration.java @@ -167,10 +167,10 @@ public class Configuration extends PathPropertyList { File result; - String path = get("conf.htmlize.categories"); + String path = get("conf.categories"); if (StringUtils.isBlank(path)) { - throw new StatoolInfosException("Entry conf.htmlize.categories is missing in configuration file."); + result = null; } else { @@ -545,6 +545,28 @@ public class Configuration extends PathPropertyList return result; } + /** + * Checks if is category file defined. + * + * @return true, if is category file defined + */ + public boolean isCategoryFileDefined() + { + boolean result; + + if (StringUtils.isBlank(get("conf.categories"))) + { + result = false; + } + else + { + result = true; + } + + // + return result; + } + /** * Checks if is federation. * diff --git a/src/fr/devinsy/statoolinfos/core/Factory.java b/src/fr/devinsy/statoolinfos/core/Factory.java index fb1b8c9..7d45287 100644 --- a/src/fr/devinsy/statoolinfos/core/Factory.java +++ b/src/fr/devinsy/statoolinfos/core/Factory.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -35,7 +35,6 @@ import fr.devinsy.statoolinfos.properties.PathProperty; import fr.devinsy.statoolinfos.properties.PathPropertyList; import fr.devinsy.statoolinfos.properties.PathPropertyUtils; import fr.devinsy.statoolinfos.properties.PropertyClassType; -import fr.devinsy.statoolinfos.util.Chrono; import fr.devinsy.strings.StringList; import fr.devinsy.strings.StringSet; @@ -66,33 +65,9 @@ public class Factory { Categories result; - result = new Categories(); - PathProperties properties = PathPropertyUtils.load(source); - StringSet prefixes = properties.getSubPrefixes(); - for (String prefix : prefixes) - { - String name = properties.get(prefix + ".name"); - String description = properties.get(prefix + ".description"); - String softwares = properties.get(prefix + ".softwares"); - String logoPath = properties.get(prefix + ".logo"); - - StringList softwareList = new StringList(); - if (StringUtils.isNotBlank(softwares)) - { - for (String string : softwares.split("[;,]")) - { - softwareList.add(string.trim()); - } - } - - Category category = new Category(name, description, softwareList); - category.setLogoPath(logoPath); - result.add(category); - } - - result.sortByName(); + result = loadCategories(properties); // return result; @@ -130,6 +105,102 @@ public class Factory return result; } + /** + * Load categories. + * + * @param properties + * the properties + * @return the categories + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static Categories loadCategories(final PathProperties properties) throws IOException + { + Categories result; + + result = new Categories(); + + StringSet prefixes = properties.getSubPrefixes(); + for (String prefix : prefixes) + { + String name = properties.get(prefix + ".name"); + String description = properties.get(prefix + ".description"); + String softwares = properties.get(prefix + ".softwares"); + String logoPath = properties.get(prefix + ".logo"); + + StringList softwareList = new StringList(); + if (StringUtils.isNotBlank(softwares)) + { + for (String string : softwares.split("[;,]")) + { + softwareList.add(string.trim()); + } + } + + Category category = new Category(name, description, softwareList); + category.setLogoPath(logoPath); + result.add(category); + } + + result.sortByName(); + + // + return result; + } + + /** + * Load categories. + * + * @param source + * the source + * @return the categories + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static Categories loadCategories(final URL source) throws IOException + { + Categories result; + + PathProperties properties = PathPropertyUtils.load(source); + + result = loadCategories(properties); + + // + return result; + } + + /** + * Load categories. + * + * @param source + * the source + * @param federation + * the federation + * @return the categories + * @throws IOException + * Signals that an I/O exception has occurred. + */ + public static Categories loadCategories(final URL source, final Federation federation) throws IOException + { + Categories result; + + result = loadCategories(source); + + Category other = new Category("Autres", "Qui ne rentre pas dans une catégorie existante."); + result.add(other); + + for (Software software : federation.getSoftwares().values()) + { + if (!result.matches(software.getName())) + { + other.getSoftwares().add(software.getName()); + } + } + + // + return result; + } + /** * Load configuration. * @@ -141,12 +212,19 @@ public class Factory * @throws IOException * Signals that an I/O exception has occurred. */ - public static Configuration loadConfiguration(final File configurationFile) throws StatoolInfosException, IOException + public static Configuration loadConfiguration(final File configurationFile) throws StatoolInfosException { Configuration result; - PathProperties properties = PathPropertyUtils.load(configurationFile); - result = new Configuration(properties); + try + { + PathProperties properties = PathPropertyUtils.load(configurationFile); + result = new Configuration(properties); + } + catch (IOException exception) + { + throw new StatoolInfosException("Error reading configuration file: " + configurationFile, exception); + } // return result; @@ -170,7 +248,6 @@ public class Factory Federation result; System.out.println("Loading federation " + inputURL); - Chrono chrono = new Chrono().start(); if (inputURL == null) { @@ -201,7 +278,7 @@ public class Factory result = new Federation(properties); result.setInputURL(inputURL); result.setInputFile(federationFile); - result.setLogoFileName(result.getTechnicalName() + "-logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); + result.setLogoFileName("logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); PropertyChecker checker = new PropertyChecker(); PropertyChecks checks = checker.checkFederation(result.getInputFile()); @@ -227,7 +304,6 @@ public class Factory result.getCrawlJournal().addAll(cache.restoreCrawlJournal()); } } - System.out.println("Federation loaded in " + chrono.format()); // return result; @@ -253,7 +329,6 @@ public class Factory System.out.println("Loading metrics " + inputURL); File inputFile = cache.restoreFile(inputURL); - if (inputFile == null) { logger.warn("WARNING: metrics not found in cache [{}]", inputURL); @@ -310,7 +385,7 @@ public class Factory { result.setInputFile(inputFile); result.setInputURL(inputURL); - result.setLogoFileName(result.getTechnicalName() + "-logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); + result.setLogoFileName("logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); // PropertyChecker checker = new PropertyChecker(); @@ -386,7 +461,7 @@ public class Factory result.setOrganization(organization); result.setInputFile(inputFile); result.setInputURL(inputURL); - result.setLogoFileName(organization.getTechnicalName() + "-" + result.getTechnicalName() + "-logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); + result.setLogoFileName("logo" + StringUtils.defaultIfBlank(cache.getExtension(result.getLogoURL()), ".png")); // PathProperties subs = result.getByPrefix("subs"); diff --git a/src/fr/devinsy/statoolinfos/core/Organization.java b/src/fr/devinsy/statoolinfos/core/Organization.java index e21eb87..30dd8bb 100644 --- a/src/fr/devinsy/statoolinfos/core/Organization.java +++ b/src/fr/devinsy/statoolinfos/core/Organization.java @@ -42,8 +42,6 @@ import fr.devinsy.statoolinfos.util.URLUtils; */ public class Organization extends PathPropertyList { - private static final long serialVersionUID = -2709210934548224213L; - public enum Status { ACTIVE, @@ -62,6 +60,8 @@ public class Organization extends PathPropertyList OTHER } + private static final long serialVersionUID = -2709210934548224213L; + private Federation federation; private Services services; private File inputFile; diff --git a/src/fr/devinsy/statoolinfos/core/Organizations.java b/src/fr/devinsy/statoolinfos/core/Organizations.java index d16cf48..e10129f 100644 --- a/src/fr/devinsy/statoolinfos/core/Organizations.java +++ b/src/fr/devinsy/statoolinfos/core/Organizations.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -21,6 +21,9 @@ package fr.devinsy.statoolinfos.core; import java.time.Year; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; + +import org.apache.commons.lang3.StringUtils; /** * The Class Organizations. @@ -37,6 +40,22 @@ public class Organizations extends ArrayList super(); } + /** + * Instantiates a new organizations. + * + * @param organization + * the organization + */ + public Organizations(final Organization organization) + { + super(); + + if (organization != null) + { + add(organization); + } + } + /** * Filter active. * @@ -227,6 +246,43 @@ public class Organizations extends ArrayList return result; } + /** + * Gets the by technical name. + * + * @param technicalName + * the technical name + * @return the by technical name + */ + public Organization getByTechnicalName(final String technicalName) + { + Organization result; + + Iterator iterator = this.iterator(); + boolean ended = false; + result = null; + while (!ended) + { + if (iterator.hasNext()) + { + Organization organization = iterator.next(); + + if (StringUtils.equals(organization.getTechnicalName(), technicalName)) + { + ended = true; + result = organization; + } + } + else + { + ended = true; + result = null; + } + } + + // + return result; + } + /** * Gets the idles. * diff --git a/src/fr/devinsy/statoolinfos/core/Services.java b/src/fr/devinsy/statoolinfos/core/Services.java index 9e868ee..32ffb73 100644 --- a/src/fr/devinsy/statoolinfos/core/Services.java +++ b/src/fr/devinsy/statoolinfos/core/Services.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -22,6 +22,7 @@ import java.time.LocalDate; import java.time.Year; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import org.apache.commons.lang3.StringUtils; @@ -42,6 +43,22 @@ public class Services extends ArrayList super(); } + /** + * Instantiates a new services. + * + * @param service + * the service + */ + public Services(final Service service) + { + super(); + + if (service != null) + { + add(service); + } + } + /** * Count by year. * @@ -190,6 +207,43 @@ public class Services extends ArrayList return result; } + /** + * Gets the by technical name. + * + * @param technicalName + * the technical name + * @return the by technical name + */ + public Service getByTechnicalName(final String technicalName) + { + Service result; + + Iterator iterator = this.iterator(); + boolean ended = false; + result = null; + while (!ended) + { + if (iterator.hasNext()) + { + Service service = iterator.next(); + + if (StringUtils.equals(service.getTechnicalName(), technicalName)) + { + ended = true; + result = service; + } + } + else + { + ended = true; + result = null; + } + } + + // + return result; + } + /** * Gets the older. * diff --git a/src/fr/devinsy/statoolinfos/core/Softwares.java b/src/fr/devinsy/statoolinfos/core/Softwares.java index 595a5fa..eb47052 100644 --- a/src/fr/devinsy/statoolinfos/core/Softwares.java +++ b/src/fr/devinsy/statoolinfos/core/Softwares.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -77,6 +77,8 @@ public class Softwares extends HashMap */ public void put(final Software software) { + put(buildKey(software.getName()), software); + for (String alias : software.getAliases()) { put(buildKey(alias), software); diff --git a/src/fr/devinsy/statoolinfos/HtmlizerContext.java b/src/fr/devinsy/statoolinfos/core/StatoolInfosContext.java similarity index 75% rename from src/fr/devinsy/statoolinfos/HtmlizerContext.java rename to src/fr/devinsy/statoolinfos/core/StatoolInfosContext.java index 556c198..40bc777 100644 --- a/src/fr/devinsy/statoolinfos/HtmlizerContext.java +++ b/src/fr/devinsy/statoolinfos/core/StatoolInfosContext.java @@ -16,30 +16,21 @@ * You should have received a copy of the GNU Affero General Public License * along with StatoolInfos. If not, see . */ -package fr.devinsy.statoolinfos; +package fr.devinsy.statoolinfos.core; import java.io.File; import java.io.IOException; +import java.net.URL; -import fr.devinsy.statoolinfos.core.Categories; -import fr.devinsy.statoolinfos.core.Configuration; -import fr.devinsy.statoolinfos.core.Factory; -import fr.devinsy.statoolinfos.core.Federation; -import fr.devinsy.statoolinfos.core.StatoolInfosException; import fr.devinsy.statoolinfos.crawl.CrawlCache; import fr.devinsy.statoolinfos.uptime.UptimeJournal; /** - * The Class HtmlizerContext. + * The Class StatoolInfosContext. */ -public class HtmlizerContext +public class StatoolInfosContext { - private static class SingletonHolder - { - private static final HtmlizerContext instance = new HtmlizerContext(); - } - - private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(HtmlizerContext.class); + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(StatoolInfosContext.class); private Configuration configuration; private Federation federation; @@ -49,9 +40,13 @@ public class HtmlizerContext /** * Instantiates a new manager. + * + * @throws IOException + * @throws StatoolInfosException */ - private HtmlizerContext() + public StatoolInfosContext(final File configurationFile) throws StatoolInfosException, IOException { + configure(configurationFile); } /** @@ -73,9 +68,20 @@ public class HtmlizerContext if (this.configuration.isFederation()) { + long startTime = System.currentTimeMillis(); + System.out.println("Loading configuration file."); this.federation = Factory.loadFederation(this.configuration.getHtmlizeInputURL(), this.cache); - this.categories = Factory.loadCategories(this.configuration.getCategoryFile(), this.federation); + if (this.configuration.isCategoryFileDefined()) + { + this.categories = Factory.loadCategories(this.configuration.getCategoryFile(), this.federation); + } + else + { + URL categoriesURL = StatoolInfosContext.class.getResource("/fr/devinsy/statoolinfos/core/categories.properties"); + this.categories = Factory.loadCategories(categoriesURL, this.federation); + } this.uptimeJournal = this.cache.restoreUptimeJournal(); + System.out.println("Loaded configuration context in " + (System.currentTimeMillis() - startTime) + " ms."); } else { @@ -152,14 +158,4 @@ public class HtmlizerContext { return this.uptimeJournal; } - - /** - * Instance. - * - * @return the manager - */ - public static HtmlizerContext instance() - { - return SingletonHolder.instance; - } } diff --git a/src/fr/devinsy/statoolinfos/crawl/CrawlCache.java b/src/fr/devinsy/statoolinfos/crawl/CrawlCache.java index 69072bb..441b0cc 100644 --- a/src/fr/devinsy/statoolinfos/crawl/CrawlCache.java +++ b/src/fr/devinsy/statoolinfos/crawl/CrawlCache.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -46,14 +46,14 @@ import fr.devinsy.statoolinfos.util.URLUtils; */ public class CrawlCache { - private static Logger logger = LoggerFactory.getLogger(CrawlCache.class); - public static enum DefaultLogoGenerator { CAT, BIRD } + private static Logger logger = LoggerFactory.getLogger(CrawlCache.class); + private File directory; /** @@ -234,7 +234,7 @@ public class CrawlCache } else { - logger.info("CatGeneratoring from {}", url); + logger.info("Restoring logo from {}", url); File logoFile = restoreFile(url); if (logoFile == null) { diff --git a/src/fr/devinsy/statoolinfos/io/CSVFile.java b/src/fr/devinsy/statoolinfos/io/CSVFile.java index 6d7090f..87667f6 100644 --- a/src/fr/devinsy/statoolinfos/io/CSVFile.java +++ b/src/fr/devinsy/statoolinfos/io/CSVFile.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021-2023 Christian Pierre MOMON + * Copyright (C) 2021-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -25,7 +25,6 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.devinsy.statoolinfos.HtmlizerContext; import fr.devinsy.statoolinfos.core.Categories; import fr.devinsy.statoolinfos.core.Organization; import fr.devinsy.statoolinfos.core.Organizations; @@ -80,13 +79,13 @@ public class CSVFile * @throws IOException * Signals that an I/O exception has occurred. */ - public static void save(final File file, final Services source) throws IOException + public static void save(final File file, final Services source, final Categories categories) throws IOException { CSVWriter out = null; try { out = new CSVWriter(file, ';'); - write(out, source); + write(out, source, categories); } finally { @@ -155,7 +154,7 @@ public class CSVFile * @throws IOException * Signals that an I/O exception has occurred. */ - public static void write(final SpreadsheetWriter out, final Services services) throws IOException + public static void write(final SpreadsheetWriter out, final Services services, final Categories categories) throws IOException { // Build label list. StringList labels = new StringList(100); @@ -188,8 +187,6 @@ public class CSVFile } out.writeEndRow(); - Categories categories = HtmlizerContext.instance().getCategories(); - // Write service lines. for (Service service : services) { diff --git a/src/fr/devinsy/statoolinfos/io/JSONFile.java b/src/fr/devinsy/statoolinfos/io/JSONFile.java index fe8c7c5..9887d8f 100644 --- a/src/fr/devinsy/statoolinfos/io/JSONFile.java +++ b/src/fr/devinsy/statoolinfos/io/JSONFile.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Christian Pierre MOMON + * Copyright (C) 2021-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -27,7 +27,6 @@ import org.apache.commons.text.StringEscapeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import fr.devinsy.statoolinfos.HtmlizerContext; import fr.devinsy.statoolinfos.core.Categories; import fr.devinsy.statoolinfos.core.Federation; import fr.devinsy.statoolinfos.core.Organization; @@ -238,11 +237,11 @@ public class JSONFile * the service * @return the string list */ - public static StringList toJSON(final Service service) + public static StringList toJSON(final Service service, final Categories categories) { StringList result; - result = toJSON((PathPropertyList) service); + result = toJSON(service); // result.removeLast(); @@ -266,7 +265,6 @@ public class JSONFile result.append(","); // - Categories categories = HtmlizerContext.instance().getCategories(); result.append("\""); result.append("software.categories"); result.append("\" : \""); diff --git a/src/fr/devinsy/statoolinfos/io/ODSFile.java b/src/fr/devinsy/statoolinfos/io/ODSFile.java index 3c431bb..2d9d374 100644 --- a/src/fr/devinsy/statoolinfos/io/ODSFile.java +++ b/src/fr/devinsy/statoolinfos/io/ODSFile.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Christian Pierre MOMON + * Copyright (C) 2021-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -24,6 +24,7 @@ import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import fr.devinsy.statoolinfos.core.Categories; import fr.devinsy.statoolinfos.core.Organizations; import fr.devinsy.statoolinfos.core.Services; @@ -32,11 +33,11 @@ import fr.devinsy.statoolinfos.core.Services; */ public class ODSFile { - public static final int MAX_LINE_SIZE = 1024; + private static final Logger logger = LoggerFactory.getLogger(ODSFile.class); - private static final Logger logger = LoggerFactory.getLogger(ODSFile.class);; + public static final int MAX_LINE_SIZE = 1024;; - protected enum Status + protected enum Status { MANDATORY, OPTIONAL @@ -75,13 +76,13 @@ public class ODSFile * @param source * the source */ - public static void save(final File file, final Services source) throws IOException + public static void save(final File file, final Services source, final Categories categories) throws IOException { ODSWriter out = null; try { out = new ODSWriter(file); - CSVFile.write(out, source); + CSVFile.write(out, source, categories); } finally { diff --git a/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStat.java b/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStat.java index 8329d05..e398239 100644 --- a/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStat.java +++ b/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStat.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Christian Pierre MOMON + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -22,15 +22,17 @@ import java.net.URL; import java.time.LocalDateTime; import fr.devinsy.statoolinfos.core.Organization; +import fr.devinsy.statoolinfos.core.Service; /** * The Class PropertiesFileStat. */ public class PropertiesFileStat { - private String localName; + private String urlName; private URL url; private Organization organization; + private Service service; private int lineCount; private int activeLineCount; private int blankPropertyCount; @@ -78,11 +80,6 @@ public class PropertiesFileStat return this.lineCount; } - public String getLocalName() - { - return this.localName; - } - public Organization getOrganization() { return this.organization; @@ -93,6 +90,11 @@ public class PropertiesFileStat return this.activeLineCount; } + public Service getService() + { + return this.service; + } + public LocalDateTime getUpdateDate() { return this.updateDate; @@ -103,6 +105,11 @@ public class PropertiesFileStat return this.url; } + public String getURLName() + { + return this.urlName; + } + public int getVoidCount() { return this.voidCount; @@ -183,16 +190,16 @@ public class PropertiesFileStat this.lineCount = lineCount; } - public void setLocalName(final String localName) - { - this.localName = localName; - } - public void setOrganization(final Organization organization) { this.organization = organization; } + public void setService(final Service service) + { + this.service = service; + } + public void setUpdateDate(final LocalDateTime updateDate) { this.updateDate = updateDate; @@ -203,6 +210,11 @@ public class PropertiesFileStat this.url = url; } + public void setURLName(final String localName) + { + this.urlName = localName; + } + public void setVoidCount(final int voidCount) { this.voidCount = voidCount; diff --git a/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStatComparator.java b/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStatComparator.java index 3783ce5..d6d9760 100644 --- a/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStatComparator.java +++ b/src/fr/devinsy/statoolinfos/stats/propertyfiles/PropertiesFileStatComparator.java @@ -1,5 +1,20 @@ /* + * Copyright (C) 2020-2024 Christian Pierre MOMON * + * This file is part of StatoolInfos, simple service statistics tool. + * + * StatoolInfos is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * StatoolInfos is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with StatoolInfos. If not, see . */ package fr.devinsy.statoolinfos.stats.propertyfiles; @@ -238,7 +253,7 @@ public class PropertiesFileStatComparator implements Comparator + * Copyright (C) 2020-2024 Christian Pierre MOMON * * This file is part of StatoolInfos, simple service statistics tool. * @@ -274,13 +274,13 @@ public class PropertiesFileStats extends ArrayList * @throws IOException * Signals that an I/O exception has occurred. */ - public void stat(final Metrics metrics, final Organization oranization) throws IOException + public void stat(final Metrics metrics, final Organization organization) throws IOException { PropertiesFileStat stat = stat(metrics.getInputFile()); stat.setURL(metrics.getInputURL()); - stat.setLocalName(metrics.getLocalFileName()); - stat.setOrganization(oranization); + stat.setURLName(metrics.getLocalFileName()); + stat.setOrganization(organization); stat.setUpdateDate(metrics.getCrawledDate()); PropertyChecker checker = new PropertyChecker(); @@ -306,8 +306,9 @@ public class PropertiesFileStats extends ArrayList PropertiesFileStat stat = stat(organization.getInputFile()); stat.setURL(organization.getInputURL()); - stat.setLocalName(organization.getTechnicalName() + ".properties"); + stat.setURLName("/federation/organizations/" + organization.getTechnicalName() + "/" + organization.getTechnicalName() + ".properties"); stat.setOrganization(organization); + stat.setService(null); stat.setUpdateDate(organization.getCrawledDate()); PropertyChecker checker = new PropertyChecker(); @@ -333,8 +334,9 @@ public class PropertiesFileStats extends ArrayList PropertiesFileStat stat = stat(service.getInputFile()); stat.setURL(service.getInputURL()); - stat.setLocalName(service.getOrganization().getTechnicalName() + "-" + service.getTechnicalName() + ".properties"); + stat.setURLName("/federation/organizations/" + service.getOrganization().getTechnicalName() + "/services/" + service.getTechnicalName() + "/" + service.getTechnicalName() + ".properties"); stat.setOrganization(service.getOrganization()); + stat.setService(service); stat.setUpdateDate(service.getCrawledDate()); PropertyChecker checker = new PropertyChecker();