Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import net.digitalid.utility.configuration.errors.InitializerError;
import net.digitalid.utility.configuration.errors.InitializerErrorBuilder;
import net.digitalid.utility.contracts.Require;
import net.digitalid.utility.functional.interfaces.Consumer;
import net.digitalid.utility.functional.iterables.FiniteIterable;
import net.digitalid.utility.validation.annotations.method.Chainable;
import net.digitalid.utility.validation.annotations.type.Functional;
Expand Down Expand Up @@ -190,6 +191,14 @@ public int getLineNumber() {
return getClassName();
}

/**
* Returns the qualified name of the class and the line number where this configuration is declared.
*/
@Pure
public @Nonnull String toLongString() {
return new StringBuilder(getQualifiedClassName()).append(":").append(getLineNumber()).toString();
}

/* -------------------------------------------------- Configurations -------------------------------------------------- */

/**
Expand Down Expand Up @@ -364,6 +373,13 @@ public boolean dependsOn(@Nonnull Configuration<?> configuration) {
return this;
}

/* -------------------------------------------------- Configuration -------------------------------------------------- */

/**
* Stores a consumer that logs the initialization if set.
*/
public static final @Nonnull Configuration<Consumer<String>> logger = Configuration.withUnknownProvider();

/* -------------------------------------------------- Initialization -------------------------------------------------- */

private boolean initialized = false;
Expand All @@ -386,6 +402,11 @@ public void initialize() {
if (!initialized) {
this.initialized = true;
for (@Nonnull Configuration<?> dependency : dependencies) { dependency.initialize(); }
if (logger.isSet()) {
final @Nonnull StringBuilder string = new StringBuilder("Initializing ").append(toLongString().replace("net.digitalid.", ""));
if (!dependencies.isEmpty()) { string.append(" depending on ").append(FiniteIterable.of(dependencies).join()); }
logger.get().consume(string.toString());
}
for (@Nonnull Initializer initializer : initializers) {
try {
initializer.execute();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ protected Initializer(@NonCaptured @Modified @Nonnull Configuration<?> target, @
* @throws Exception if any problems occur.
*/
@Impure
protected abstract void execute() throws Exception;
public abstract void execute() throws Exception;

}
Original file line number Diff line number Diff line change
Expand Up @@ -118,19 +118,19 @@ private String importConverterType(@Nonnull TypeMirror typeMirror, @Nonnull Fini
/* -------------------------------------------------- Externally and Non-Externally Provided Fields -------------------------------------------------- */

/**
* Returns all field information objects that do not have a @Provided annotation.
* Returns the fields that have to be converted (because they are representative but not provided).
*/
@Pure
private @Nonnull FiniteIterable<@Nonnull FieldInformation> filterNonExternallyProvidedFields(@Nonnull FiniteIterable<@Nonnull FieldInformation> fieldInformation) {
return fieldInformation.filter(field -> !field.hasAnnotation(Provided.class));
private @Nonnull FiniteIterable<@Nonnull FieldInformation> getFieldsToBeConverted() {
return typeInformation.getRepresentingFieldInformation().filter(field -> !field.hasAnnotation(Provided.class));
}

/**
* Returns all field information objects that do have a @Provided annotation.
* Returns the fields that are provided (and thus do not need to be converted).
*/
@Pure
private @Nonnull FiniteIterable<@Nonnull FieldInformation> filterExternallyProvidedFields(@Nonnull FiniteIterable<@Nonnull FieldInformation> fieldInformation) {
return fieldInformation.filter(field -> field.hasAnnotation(Provided.class));
private @Nonnull FiniteIterable<@Nonnull FieldInformation> getProvidedFields() {
return typeInformation.getFieldInformation().filter(field -> field.hasAnnotation(Provided.class));
}

/**
Expand All @@ -140,15 +140,15 @@ private String importConverterType(@Nonnull TypeMirror typeMirror, @Nonnull Fini
@SuppressWarnings("AssignmentToMethodParameter")
private @Nonnull String getExternallyProvidedParameterDeclarationsAsString(@Nonnull String postFix) {
postFix = postFix.isEmpty() ? postFix : " " + postFix;
final @Nonnull FiniteIterable<@Nonnull FieldInformation> externallyProvidedFields = filterExternallyProvidedFields(typeInformation.getRepresentingFieldInformation());
final @Nonnull String parameterTypes = externallyProvidedFields.map(field -> importIfPossible(field.getType())).join();
final @Nullable Class<?> tupleType = Tuple.getTupleType(externallyProvidedFields.size());
final @Nonnull FiniteIterable<@Nonnull FieldInformation> providedFields = getProvidedFields();
final @Nonnull String parameterTypes = providedFields.map(field -> importIfPossible(field.getType())).join();
final @Nullable Class<?> tupleType = Tuple.getTupleType(providedFields.size());
if (tupleType == null) {
switch (externallyProvidedFields.size()) {
switch (providedFields.size()) {
case 0:
return importIfPossible(Void.class) + postFix;
case 1:
return importIfPossible(externallyProvidedFields.getFirst().getType()) + postFix;
return importIfPossible(providedFields.getFirst().getType()) + postFix;
default:
throw FailedClassGenerationException.with("Cannot accept more than 8 externally provided parameters.");
}
Expand All @@ -161,12 +161,12 @@ private String importConverterType(@Nonnull TypeMirror typeMirror, @Nonnull Fini
*/
@Pure
private @Nonnull String getExternallyProvidedParameterNameAsString() {
final @Nonnull FiniteIterable<@Nonnull FieldInformation> externallyProvidedFields = filterExternallyProvidedFields(typeInformation.getRepresentingFieldInformation());
switch (externallyProvidedFields.size()) {
final @Nonnull FiniteIterable<@Nonnull FieldInformation> providedFields = getProvidedFields();
switch (providedFields.size()) {
case 0:
return "none";
case 1:
return externallyProvidedFields.getFirst().getName();
return providedFields.getFirst().getName();
case 2:
case 3:
case 4:
Expand Down Expand Up @@ -277,7 +277,7 @@ private void generateConvertMethod() {
addAnnotation(Pure.class);
addAnnotation(Override.class);
beginMethod("public " + Brackets.inPointy("EXCEPTION extends " + importIfPossible(ConnectionException.class)) + " void convert(@" + importIfPossible(NonCaptured.class) + " @" + importIfPossible(Unmodified.class) + " @" + importIfPossible(Nonnull.class) + " " + typeInformation.getName() + " " + getObjectVariableName() + ", @" + importIfPossible(Nonnull.class) + " @" + importIfPossible(NonCaptured.class) + " @" + importIfPossible(Modified.class) + " " + importIfPossible(Encoder.class) + Brackets.inPointy("EXCEPTION") + " encoder) throws EXCEPTION");
filterNonExternallyProvidedFields(typeInformation.getRepresentingFieldInformation()).doForEach(this::addEncodingStatement);
getFieldsToBeConverted().doForEach(this::addEncodingStatement);
// for (@Nonnull FieldInformation field : fields) {
// final @Nonnull String fieldAccess = objectVariableName + "." + field.getAccessCode();
// addStatement("i *= " + generateValueCollectorCall(fieldAccess, field.getType(), 1));
Expand Down Expand Up @@ -411,16 +411,16 @@ protected void generateRecoverMethod() {
addAnnotation(Pure.class);
addAnnotation(Override.class);
beginMethod("public @" + importIfPossible(Capturable.class) + " @" + importIfPossible(Nonnull.class) + " " + Brackets.inPointy("EXCEPTION extends " + importIfPossible(ConnectionException.class)) + " " + typeInformation.getName() + " recover(@" + importIfPossible(Nonnull.class) + " @" + importIfPossible(NonCaptured.class) + " " + importIfPossible(Decoder.class) + Brackets.inPointy("EXCEPTION") + " decoder, " + getExternallyProvidedParameterDeclarationsAsString(getExternallyProvidedParameterNameAsString()) + ") throws EXCEPTION, " + importIfPossible(RecoveryException.class));
final @Nonnull FiniteIterable<@Nonnull FieldInformation> externallyProvidedFields = filterExternallyProvidedFields(typeInformation.getRepresentingFieldInformation());
final @Nonnull FiniteIterable<@Nonnull FieldInformation> providedFields = getProvidedFields();

if (externallyProvidedFields.size() > 1) {
if (providedFields.size() > 1) {
int i = 0;
for (@Nonnull FieldInformation externallyProvidedField : externallyProvidedFields) {
for (@Nonnull FieldInformation externallyProvidedField : providedFields) {
addStatement("final " + importIfPossible(externallyProvidedField.getType()) + " " + externallyProvidedField.getName() + " = provided.get" + i++ + "()");
}
}

final @Nonnull FiniteIterable<@Nonnull FieldInformation> fields = filterNonExternallyProvidedFields(typeInformation.getRepresentingFieldInformation());
final @Nonnull FiniteIterable<@Nonnull FieldInformation> fields = getFieldsToBeConverted();

// for (@Nonnull FieldInformation constructorParameter : fields) {
// final @Nonnull String provide = constructorParameter.hasAnnotation(Provide.class) ? constructorParameter.getAnnotation(Provide.class).value() : "null";
Expand All @@ -434,7 +434,7 @@ protected void generateRecoverMethod() {
fields.doForEach(this::addDecodingStatement);
final @Nullable ExecutableInformation recoverConstructorOrMethod = typeInformation.getRecoverConstructorOrMethod();
if (!getThrownTypesOfInitializeMethod().isEmpty() || recoverConstructorOrMethod != null && recoverConstructorOrMethod.throwsExceptions()) { beginTry(); }
addStatement(typeInformation.getInstantiationCode(true, true, true, externallyProvidedFields.combine(fields)));
addStatement(typeInformation.getInstantiationCode(true, true, true, providedFields.combine(fields)));
if (!getThrownTypesOfInitializeMethod().isEmpty() || recoverConstructorOrMethod != null && recoverConstructorOrMethod.throwsExceptions()) {
if (recoverConstructorOrMethod != null && recoverConstructorOrMethod.throwsExceptions()) {
endTryOrCatchBeginCatch(recoverConstructorOrMethod.getElement().getThrownTypes());
Expand Down Expand Up @@ -477,7 +477,7 @@ private void generateFields() {
final @Nonnull StringBuilder fieldsString = new StringBuilder();
final @Nonnull List<@Nonnull String> statements = new ArrayList<>();
boolean addedMap = false;
for (@Nonnull FieldInformation representingField : filterNonExternallyProvidedFields(typeInformation.getRepresentingFieldInformation())) {
for (@Nonnull FieldInformation representingField : getFieldsToBeConverted()) {
final @Nonnull StringBuilder customAnnotations = new StringBuilder();
final @Nonnull FiniteIterable<@Nonnull AnnotationMirror> annotations = representingField.getAnnotations();
final @Nonnull String fieldName = representingField.getName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ protected LoggingInitializer(@NonCaptured @Modified @Nonnull Configuration<?> ta

@Impure
@Override
protected final void execute() throws Exception {
public final void execute() throws Exception {
Log.debugging("The initializer " + this + " begins its execution.");
final long start = System.currentTimeMillis();
executeWithoutLogging();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,15 @@ public static void initializeLogger() throws FileNotFoundException {
}
}

/**
* Initializes the logger of the configuration class.
*/
@PureWithSideEffects
@Initialize(target = Configuration.class, dependencies = Logger.class)
public static void initializeConfigurationLogger() {
Configuration.logger.set(string -> Log.debugging(string));
}

/* -------------------------------------------------- Threading -------------------------------------------------- */

/**
Expand Down