Skip to content

Commit 796b8e7

Browse files
authored
Fix Logger - ConfigManager circular reference (#1054)
1 parent 36ba8b5 commit 796b8e7

File tree

4 files changed

+86
-10
lines changed

4 files changed

+86
-10
lines changed

photon-core/src/main/java/org/photonvision/common/configuration/ConfigManager.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ enum ConfigSaveStrategy {
6262

6363
public static ConfigManager getInstance() {
6464
if (INSTANCE == null) {
65+
Path rootFolder = PathManager.getInstance().getRootFolder();
6566
switch (m_saveStrat) {
6667
case SQL:
67-
INSTANCE = new ConfigManager(getRootFolder(), new SqlConfigProvider(getRootFolder()));
68+
INSTANCE = new ConfigManager(rootFolder, new SqlConfigProvider(rootFolder));
6869
break;
6970
case LEGACY:
70-
INSTANCE = new ConfigManager(getRootFolder(), new LegacyConfigProvider(getRootFolder()));
71+
INSTANCE = new ConfigManager(rootFolder, new LegacyConfigProvider(rootFolder));
7172
break;
7273
case ATOMIC_ZIP:
7374
// not yet done, fall through
@@ -78,7 +79,7 @@ public static ConfigManager getInstance() {
7879
return INSTANCE;
7980
}
8081

81-
private static final Logger logger = new Logger(ConfigManager.class, LogGroup.General);
82+
private static final Logger logger = new Logger(ConfigManager.class, LogGroup.Config);
8283

8384
private void translateLegacyIfPresent(Path folderPath) {
8485
if (!(m_provider instanceof SqlConfigProvider)) {
@@ -167,7 +168,7 @@ public PhotonConfiguration getConfig() {
167168
}
168169

169170
private static Path getRootFolder() {
170-
return Path.of("photonvision_config");
171+
return PathManager.getInstance().getRootFolder();
171172
}
172173

173174
ConfigManager(Path configDirectory, ConfigProvider provider) {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Copyright (C) Photon Vision.
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package org.photonvision.common.configuration;
19+
20+
import java.io.File;
21+
import java.nio.file.Path;
22+
import java.text.DateFormat;
23+
import java.text.ParseException;
24+
import java.text.SimpleDateFormat;
25+
import java.time.LocalDateTime;
26+
import java.time.format.DateTimeFormatter;
27+
import java.time.temporal.TemporalAccessor;
28+
import java.util.Date;
29+
30+
public class PathManager {
31+
private static PathManager INSTANCE;
32+
33+
final File configDirectoryFile;
34+
35+
public static PathManager getInstance() {
36+
if (INSTANCE == null) {
37+
INSTANCE = new PathManager();
38+
}
39+
return INSTANCE;
40+
}
41+
42+
private PathManager() {
43+
this.configDirectoryFile = new File(getRootFolder().toUri());
44+
}
45+
46+
public Path getRootFolder() {
47+
return Path.of("photonvision_config");
48+
}
49+
50+
public Path getLogsDir() {
51+
return Path.of(configDirectoryFile.toString(), "logs");
52+
}
53+
54+
public static final String LOG_PREFIX = "photonvision-";
55+
public static final String LOG_EXT = ".log";
56+
public static final String LOG_DATE_TIME_FORMAT = "yyyy-M-d_hh-mm-ss";
57+
58+
public String taToLogFname(TemporalAccessor date) {
59+
var dateString = DateTimeFormatter.ofPattern(LOG_DATE_TIME_FORMAT).format(date);
60+
return LOG_PREFIX + dateString + LOG_EXT;
61+
}
62+
63+
public Path getLogPath() {
64+
var logFile = Path.of(this.getLogsDir().toString(), taToLogFname(LocalDateTime.now())).toFile();
65+
if (!logFile.getParentFile().exists()) logFile.getParentFile().mkdirs();
66+
return logFile.toPath();
67+
}
68+
69+
public Date logFnameToDate(String fname) throws ParseException {
70+
// Strip away known unneeded portions of the log file name
71+
fname = fname.replace(LOG_PREFIX, "").replace(LOG_EXT, "");
72+
DateFormat format = new SimpleDateFormat(LOG_DATE_TIME_FORMAT);
73+
return format.parse(fname);
74+
}
75+
}

photon-core/src/main/java/org/photonvision/common/configuration/SqlConfigProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
* <p>Global has one row per global config file (like hardware settings and network settings)
4646
*/
4747
public class SqlConfigProvider extends ConfigProvider {
48-
private final Logger logger = new Logger(SqlConfigProvider.class, LogGroup.Config);
48+
private static final Logger logger = new Logger(SqlConfigProvider.class, LogGroup.Config);
4949

5050
static class TableKeys {
5151
static final String CAM_UNIQUE_NAME = "unique_name";

photon-core/src/main/java/org/photonvision/common/logging/Logger.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
import java.util.*;
2525
import java.util.function.Supplier;
2626
import org.apache.commons.lang3.tuple.Pair;
27-
import org.photonvision.common.configuration.ConfigManager;
27+
// import org.photonvision.common.configuration.ConfigManager;
28+
import org.photonvision.common.configuration.PathManager;
2829
import org.photonvision.common.dataflow.DataChangeService;
2930
import org.photonvision.common.dataflow.events.OutgoingUIEvent;
3031
import org.photonvision.common.util.TimedTaskManager;
@@ -103,8 +104,8 @@ public static String format(
103104
static {
104105
currentAppenders.add(new ConsoleLogAppender());
105106
currentAppenders.add(uiLogAppender);
106-
addFileAppender(ConfigManager.getInstance().getLogPath());
107-
cleanLogs(ConfigManager.getInstance().getLogsDir());
107+
addFileAppender(PathManager.getInstance().getLogPath());
108+
cleanLogs(PathManager.getInstance().getLogsDir());
108109
}
109110

110111
@SuppressWarnings("ResultOfMethodCallIgnored")
@@ -133,8 +134,7 @@ public static void cleanLogs(Path folderToClean) {
133134
logFileList.removeIf(
134135
(File arg0) -> {
135136
try {
136-
logFileStartDateMap.put(
137-
arg0, ConfigManager.getInstance().logFnameToDate(arg0.getName()));
137+
logFileStartDateMap.put(arg0, PathManager.getInstance().logFnameToDate(arg0.getName()));
138138
return false;
139139
} catch (ParseException e) {
140140
return true;

0 commit comments

Comments
 (0)