Skip to content

Commit e33309f

Browse files
committed
Added a Logging Library :>
1 parent 2fa78e8 commit e33309f

10 files changed

Lines changed: 382 additions & 5 deletions

File tree

src/main/java/module-info.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@
33
requires static com.google.gson;
44
requires static java.sql;
55

6-
exports org.mangorage.bootstrap.api.transformer;
7-
exports org.mangorage.bootstrap.api.module;
6+
exports org.mangorage.bootstrap.api.dependency;
87
exports org.mangorage.bootstrap.api.launch;
8+
exports org.mangorage.bootstrap.api.lifecycle;
99
exports org.mangorage.bootstrap.api.loader;
10-
exports org.mangorage.bootstrap.api.dependency;
10+
exports org.mangorage.bootstrap.api.logging;
11+
exports org.mangorage.bootstrap.api.module;
12+
exports org.mangorage.bootstrap.api.transformer;
1113
exports org.mangorage.bootstrap.api.util;
1214

1315
opens org.mangorage.bootstrap;
1416

1517
uses org.mangorage.bootstrap.api.launch.ILaunchTarget;
1618
uses org.mangorage.bootstrap.api.lifecycle.IBootstrapLifecycle;
19+
uses org.mangorage.bootstrap.api.logging.ILoggerProvider;
1720
}

src/main/java/org/mangorage/bootstrap/Bootstrap.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.mangorage.bootstrap;
22

33
import org.mangorage.bootstrap.api.launch.ILaunchTarget;
4+
import org.mangorage.bootstrap.internal.logger.DefaultLoggerFactory;
45
import org.mangorage.bootstrap.internal.util.Util;
56

67
import java.lang.module.Configuration;
@@ -58,6 +59,9 @@ public static void main(String[] args) throws Throwable {
5859
Path launchPath = Path.of(DEFAULT_LAUNCH_PATH);
5960

6061
final ModuleLayer moduleLayer = createLaunchModuleLayer(parent, launchPath);
62+
63+
DefaultLoggerFactory.load(moduleLayer); // Load the providers this layer has!
64+
6165
final Map<String, ILaunchTarget> launchTargetMap = discoverLaunchTargets(moduleLayer);
6266

6367
if (!launchTargetMap.containsKey(launchTarget)) {
@@ -67,6 +71,7 @@ public static void main(String[] args) throws Throwable {
6771
}
6872

6973
LOGGER.info("Loading BootstrapLifecycle hooks");
74+
7075
final var lifecycleHooks = ServiceLoader.load(moduleLayer, org.mangorage.bootstrap.api.lifecycle.IBootstrapLifecycle.class)
7176
.stream()
7277
.map(ServiceLoader.Provider::get)
@@ -75,7 +80,10 @@ public static void main(String[] args) throws Throwable {
7580
LOGGER.info("Launching target: " + launchTarget);
7681

7782
try {
78-
launchTargetMap.get(launchTarget).launch(moduleLayer, parent, args);
83+
final var launchLayer = launchTargetMap.get(launchTarget).launch(moduleLayer, parent, args);
84+
if (launchLayer != null) {
85+
DefaultLoggerFactory.load(launchLayer); // Load the providers this layer has!
86+
}
7987
} catch (Throwable t) {
8088
LOGGER.log(Level.SEVERE, "Error during launch target execution: " + launchTarget, t);
8189
lifecycleHooks.forEach(hook -> hook.onError(t, moduleLayer));

src/main/java/org/mangorage/bootstrap/api/launch/ILaunchTarget.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@
33
public interface ILaunchTarget {
44
String getId();
55

6-
void launch(ModuleLayer bootstrapLayer, ModuleLayer parent, String[] args) throws Throwable;
6+
/**
7+
* @return The ModuleLayer that was created!
8+
*/
9+
ModuleLayer launch(ModuleLayer bootstrapLayer, ModuleLayer parent, String[] args) throws Throwable;
710
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.mangorage.bootstrap.api.logging;
2+
3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
6+
public abstract class AbstractLoggerProvider implements ILoggerProvider {
7+
private final String name;
8+
private final Map<String, IMangoLogger> loggerCache = new ConcurrentHashMap<>();
9+
10+
public AbstractLoggerProvider(String name) {
11+
this.name = name;
12+
}
13+
14+
protected abstract IMangoLogger createLogger(String name);
15+
16+
@Override
17+
public String getName() {
18+
return name;
19+
}
20+
21+
@Override
22+
public IMangoLogger getLogger(String name) {
23+
return loggerCache.computeIfAbsent(name, this::createLogger);
24+
}
25+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.mangorage.bootstrap.api.logging;
2+
3+
import org.mangorage.bootstrap.internal.logger.DefaultLoggerFactory;
4+
5+
public interface ILoggerFactory {
6+
static ILoggerFactory getDefault() {
7+
return DefaultLoggerFactory.INSTANCE;
8+
}
9+
10+
/**
11+
* Gets the logger provider by its name. The name is defined by the provider itself
12+
* and can be used to differentiate between multiple providers.
13+
*/
14+
ILoggerProvider getProvider(String providerName);
15+
16+
/**
17+
* Gets the wrapped logger provider by its name. This is used to get the underlying logger provider
18+
* Sometimes providers come in later then originally requested, so this method can be used to use the provider after it has been loaded.
19+
*/
20+
default ILoggerProvider getWrappedProvider(String providerName) {
21+
return new ILoggerProvider() {
22+
private volatile ILoggerProvider delegate;
23+
24+
@Override
25+
public String getName() {
26+
return delegate == null ? providerName : delegate.getName();
27+
}
28+
29+
@Override
30+
public IMangoLogger getLogger(String name) {
31+
if (delegate == null) {
32+
delegate = getProvider(providerName);
33+
}
34+
return delegate.getLogger(name);
35+
}
36+
};
37+
}
38+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.mangorage.bootstrap.api.logging;
2+
3+
public interface ILoggerProvider {
4+
5+
String getName();
6+
7+
default IMangoLogger getLogger(Class<?> clazz) {
8+
return getLogger(clazz.getName());
9+
}
10+
11+
IMangoLogger getLogger(String name);
12+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.mangorage.bootstrap.api.logging;
2+
3+
/**
4+
* Enhanced logging wrapper that can delegate to different logging implementations.
5+
* Provides additional "fun" features while maintaining standard logging compatibility.
6+
*/
7+
public interface IMangoLogger {
8+
9+
<T> T unwrap(Class<T> loggerClass) throws UnsupportedOperationException;
10+
11+
// Standard logging methods
12+
void trace(String message);
13+
void trace(String message, Object... args);
14+
void trace(String message, Throwable throwable);
15+
16+
void debug(String message);
17+
void debug(String message, Object... args);
18+
void debug(String message, Throwable throwable);
19+
20+
void info(String message);
21+
void info(String message, Object... args);
22+
void info(String message, Throwable throwable);
23+
24+
void warn(String message);
25+
void warn(String message, Object... args);
26+
void warn(String message, Throwable throwable);
27+
28+
void error(String message);
29+
void error(String message, Object... args);
30+
void error(String message, Throwable throwable);
31+
32+
// Fun/Enhanced methods
33+
void rainbow(String message);
34+
void celebration(String message);
35+
void dramatic(String message);
36+
void whisper(String message);
37+
void shout(String message);
38+
void withEmoji(String emoji, String message);
39+
void withBorder(String message);
40+
void withContext(String context, String message);
41+
42+
// Utility methods
43+
boolean isTraceEnabled();
44+
boolean isDebugEnabled();
45+
boolean isInfoEnabled();
46+
boolean isWarnEnabled();
47+
boolean isErrorEnabled();
48+
49+
String getName();
50+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.mangorage.bootstrap.internal.logger;
2+
3+
import org.mangorage.bootstrap.api.logging.ILoggerFactory;
4+
import org.mangorage.bootstrap.api.logging.ILoggerProvider;
5+
import java.util.Map;
6+
import java.util.ServiceLoader;
7+
import java.util.concurrent.ConcurrentHashMap;
8+
9+
public class DefaultLoggerFactory implements ILoggerFactory {
10+
public static final DefaultLoggerFactory INSTANCE = new DefaultLoggerFactory();
11+
private static final Map<String, ILoggerProvider> providers = new ConcurrentHashMap<>(); // Placeholder for actual provider storage
12+
13+
static {
14+
providers.put("default", DefaultLoggerProvider.INSTANCE);
15+
}
16+
17+
public static void load(ModuleLayer moduleLayer) {
18+
ServiceLoader.load(moduleLayer, ILoggerProvider.class).forEach(provider -> {
19+
// Register the provider in some way, e.g., add it to a map
20+
providers.put(provider.getName(), provider);
21+
});
22+
}
23+
24+
DefaultLoggerFactory() {
25+
}
26+
27+
@Override
28+
public ILoggerProvider getProvider(String providerName) {
29+
return providers.getOrDefault(providerName, DefaultLoggerProvider.INSTANCE);
30+
}
31+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.mangorage.bootstrap.internal.logger;
2+
3+
import org.mangorage.bootstrap.api.logging.AbstractLoggerProvider;
4+
import org.mangorage.bootstrap.api.logging.ILoggerProvider;
5+
import org.mangorage.bootstrap.api.logging.IMangoLogger;
6+
7+
public final class DefaultLoggerProvider extends AbstractLoggerProvider {
8+
public static final ILoggerProvider INSTANCE = new DefaultLoggerProvider("default");
9+
10+
DefaultLoggerProvider(String name) {
11+
super(name);
12+
}
13+
14+
@Override
15+
protected IMangoLogger createLogger(String name) {
16+
return new JulMangoLogger(name);
17+
}
18+
}

0 commit comments

Comments
 (0)