
one.xingyi.optics.annotations.serialise.IAnnotationProcessorStorer Maven / Gradle / Ivy
package one.xingyi.optics.annotations.serialise;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import one.xingyi.optics.annotations.processors.PackageAndClass;
import one.xingyi.optics.annotations.utils.IFunctionWithIoException;
import javax.tools.FileObject;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
/**
* For traversals we need to be able to walk to the next class and find its traversals
*/
public interface IAnnotationProcessorStorer {
void store(From from, To to) throws IOException;
}
@EqualsAndHashCode
@Getter
@ToString
@RequiredArgsConstructor
class AnnotationProcessorStorer implements IAnnotationProcessorStorer {
private final Function fromToClassName;
private final IFunctionWithIoException classNameToFileObject;
private final Function printer;
@Override
public void store(From from, To to) throws IOException {
var fileObject = classNameToFileObject.apply(fromToClassName.apply(from));
try (var writer = fileObject.openWriter()) {
writer.write(printer.apply(to));
}
}
}
@EqualsAndHashCode
@Getter
@ToString
@RequiredArgsConstructor
class CachedAnnotationProcessorStorer implements IAnnotationProcessorStorer {
private final IAnnotationProcessorStorer storer;
private final ConcurrentHashMap cache;
private final Function fromToClassName;
@Override
public void store(From from, To to) throws IOException {
var className = fromToClassName.apply(from);
cache.put(className, to);
storer.store(from, to);
}
}
@EqualsAndHashCode
@Getter
@ToString
@RequiredArgsConstructor
class DebuggingAnnotationProcessorStorer implements IAnnotationProcessorStorer {
private final IAnnotationProcessorStorer storer;
private final Predicate debugPredicate;
private final Consumer logger;
@Override
public void store(From from, To to) throws IOException {
try {
if (debugPredicate.test(from)) logger.accept("Stored " + from + " giving " + to);
storer.store(from, to);
if (debugPredicate.test(from)) logger.accept("Stored " + from);
} catch (IOException | RuntimeException e) {
logger.accept("Error storing " + from + ", " + to + e.getMessage());
throw e;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy