Skip to content

Commit

Permalink
Consolidate formatter and encoder registry
Browse files Browse the repository at this point in the history
  • Loading branch information
agentgt committed Jan 26, 2024
1 parent 250b1a6 commit f58da2d
Show file tree
Hide file tree
Showing 12 changed files with 400 additions and 285 deletions.
31 changes: 29 additions & 2 deletions core/src/main/java/io/jstach/rainbowgum/LogAppender.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.jstach.rainbowgum;

import java.net.URI;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
Expand Down Expand Up @@ -84,6 +85,22 @@ public static LogAppender of(List<? extends LogAppender> appenders) {
return new CompositeLogAppender(appenders.toArray(new LogAppender[] {}));
}

/**
* Finds an appender based on URI.
*/
public interface AppenderProvider {

/**
* Loads an appender from a URI.
* @param uri uri.
* @param name name of appender.
* @param config config to access properties and other components like encoders.
* @return appender.
*/
LogAppender provide(URI uri, String name, LogConfig config);

}

/**
* Builder for creating standard appenders.
* <p>
Expand Down Expand Up @@ -120,14 +137,24 @@ public Builder output(Provider<LogOutput> output) {
return this;
}

/**
* Sets output.
* @param output output.
* @return builder.
*/
public Builder output(LogOutput output) {
this.output = Provider.of(output);
return this;
}

/**
* Sets formatter as encoder.
* @param formatter formatter to be converted to encoder.
* @return builder.
* @see LogEncoder#of(LogFormatter)
*/
public Builder formatter(LogFormatter formatter) {
this.encoder = LogEncoder.of(formatter);
this.encoder = Provider.of(LogEncoder.of(formatter));
return this;
}

Expand All @@ -138,7 +165,7 @@ public Builder formatter(LogFormatter formatter) {
* @see LogEncoder#of(LogFormatter)
*/
public Builder formatter(LogFormatter.EventFormatter formatter) {
this.encoder = LogEncoder.of(formatter);
this.encoder = Provider.of(LogEncoder.of(formatter));
return this;
}

Expand Down
72 changes: 32 additions & 40 deletions core/src/main/java/io/jstach/rainbowgum/LogAppenderRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,26 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

import org.eclipse.jdt.annotation.Nullable;

import io.jstach.rainbowgum.LogConfig.Provider;
import io.jstach.rainbowgum.LogAppender.AppenderProvider;
import io.jstach.rainbowgum.LogProperties.Property;

/**
* Register appenders by name.
*/
public sealed interface LogAppenderRegistry permits DefaultAppenderRegistry {
public sealed interface LogAppenderRegistry extends AppenderProvider permits DefaultAppenderRegistry {

/**
* Finds an appender by name.
* @param name name of the appender.
* @return appender provider to be used for creating the appender.
* Register a provider by {@link URI#getScheme() scheme}.
* @param scheme URI scheme to match for.
* @param provider provider for scheme.
*/
Optional<Provider<LogAppender>> appender(String name);

/**
* Registers an appender provider by name.
* @param name of the appender.
* @param appenderProvider factory to be used for creating appenders.
*/
void register(String name, Provider<LogAppender> appenderProvider);
public void register(String scheme, AppenderProvider provider);

/**
* Creates a log appender registry.
Expand Down Expand Up @@ -63,12 +57,7 @@ private static String validateName(String name) {

final class DefaultAppenderRegistry implements LogAppenderRegistry {

/*
* TODO The shit in here is a mess because auto configuration of appenders based on
* properties is complicated particularly because we want to support Spring Boots
* configuration OOB.
*/
private final Map<String, Provider<LogAppender>> providers = new ConcurrentHashMap<>();
private final Map<String, AppenderProvider> providers = new ConcurrentHashMap<>();

static final Property<URI> fileProperty = Property.builder().toURI().build(LogProperties.FILE_PROPERTY);

Expand All @@ -77,6 +66,21 @@ final class DefaultAppenderRegistry implements LogAppenderRegistry {
.orElse(List.of())
.build(LogProperties.APPENDERS_PROPERTY);

@Override
public LogAppender provide(URI uri, String name, LogConfig properties) {
throw new NoSuchElementException(uri.toString());
}

@Override
public void register(String scheme, AppenderProvider provider) {
providers.put(scheme, provider);
}

/*
* TODO The shit in here is a mess because auto configuration of appenders based on
* properties is complicated particularly because we want to support Spring Boots
* configuration OOB.
*/
static List<LogAppender> defaultAppenders(LogConfig config) {
List<LogAppender> appenders = new ArrayList<>();
fileAppender(config).ifPresent(appenders::add);
Expand Down Expand Up @@ -135,25 +139,29 @@ static LogAppender appender( //
}

static LogAppender appender( //
AppenderConfig builder, //
AppenderConfig appenderConfig, //
LogConfig config, //
Property<LogOutput> outputProperty, Property<LogEncoder> encoderProperty) {

@Nullable
LogOutput output = builder.output();
LogOutput output = appenderConfig.output();
@Nullable
LogEncoder encoder = builder.encoder();
LogEncoder encoder = appenderConfig.encoder();
var properties = config.properties();

if (output == null) {
output = outputProperty.get(properties).value();
}

if (output instanceof LogEncoder e) {
encoder = e;
}

if (encoder == null) {
var _output = output;
encoder = encoderProperty.get(properties).value(() -> {
var formatterRegistry = config.formatterRegistry();
return LogEncoder.of(formatterRegistry.formatterForOutputType(_output.type()));
var encoderRegistry = config.encoderRegistry();
return encoderRegistry.encoderForOutputType(_output.type());
});
}

Expand All @@ -165,11 +173,6 @@ static LogAppender appender( //
String name, //
LogConfig config, //
Property<LogOutput> outputProperty, Property<LogEncoder> encoderProperty) {
var appenderRegistry = config.appenderRegistry();
var appender = appenderRegistry.appender(name).map(a -> a.provide(config)).orElse(null);
if (appender != null) {
return appender;
}
var builder = new AppenderConfig(name, null, null);
return appender(builder, config, outputProperty, encoderProperty);

Expand Down Expand Up @@ -199,15 +202,4 @@ private static Property<LogEncoder> encoderProperty(String propertyName, String
.buildWithName(propertyName, name);
}

@Override
public Optional<Provider<LogAppender>> appender(String name) {
return Optional.ofNullable(providers.get(name));
}

@Override
public void register(String name, Provider<LogAppender> appenderProvider) {
providers.put(name, appenderProvider);

}

}
24 changes: 10 additions & 14 deletions core/src/main/java/io/jstach/rainbowgum/LogConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,6 @@ public sealed interface LogConfig {
*/
public LevelConfig levelResolver();

/**
* Registered formatters.
* @return formatter registry.
*/
public LogFormatterRegistry formatterRegistry();

/**
* Output provider that uses URI to find output.
* @return output provider.
Expand Down Expand Up @@ -126,6 +120,16 @@ public interface Provider<T> {
return provider.provide(config);
}

/**
* Creates a provider of instance that is already configured.
* @param <U> component
* @param instance component instance.
* @return this.
*/
public static <U> Provider<U> of(U instance) {
return c -> instance;
}

}

/**
Expand Down Expand Up @@ -299,8 +303,6 @@ final class DefaultLogConfig implements LogConfig {

private final LogOutputRegistry outputRegistry;

private final LogFormatterRegistry formatterRegistry;

private final LogAppenderRegistry appenderRegistry;

private final LogEncoderRegistry encoderRegistry;
Expand All @@ -317,7 +319,6 @@ protected LogConfig _config() {
}
};
this.outputRegistry = LogOutputRegistry.of();
this.formatterRegistry = LogFormatterRegistry.of();
this.appenderRegistry = LogAppenderRegistry.of();
this.encoderRegistry = LogEncoderRegistry.of();
}
Expand Down Expand Up @@ -347,11 +348,6 @@ public LogOutputRegistry outputRegistry() {
return this.outputRegistry;
}

@Override
public LogFormatterRegistry formatterRegistry() {
return this.formatterRegistry;
}

@Override
public LogAppenderRegistry appenderRegistry() {
return this.appenderRegistry;
Expand Down
Loading

0 comments on commit f58da2d

Please sign in to comment.