Skip to content

Commit

Permalink
Allow resolving of complex placeholder data
Browse files Browse the repository at this point in the history
To allow creation of complex placeholder data (with custom placeholder
registries, options, and parental relations), an additional interface
`PlaceholderDataFactory` is introduced, which can be used in
applications using the library.
  • Loading branch information
AntonOellerer committed Aug 22, 2023
1 parent 24e3e5c commit 3fed2dc
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 3 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -8,7 +8,7 @@ plugins {
}

group 'com.docutools'
version = '1.6.6'
version = '1.6.7-beta.1'

java {
toolchain {
Expand Down
Expand Up @@ -13,6 +13,7 @@
import com.docutools.jocument.annotations.Numeric;
import com.docutools.jocument.annotations.Percentage;
import com.docutools.jocument.annotations.Translatable;
import com.docutools.jocument.impl.excel.util.PlaceholderDataFactory;
import com.docutools.jocument.impl.models.MatchPlaceholderData;
import com.docutools.jocument.impl.word.placeholders.ImagePlaceholderData;
import java.lang.annotation.Annotation;
Expand Down Expand Up @@ -347,6 +348,10 @@ private Optional<PlaceholderData> doReflectiveResolve(String placeholderName, Lo
.map(object -> (PlaceholderResolver) new ReflectionResolver(object, customPlaceholderRegistry, options, this))
.toList();
return Optional.of(new IterablePlaceholderData(list, list.size()));
} else if (property instanceof PlaceholderData placeholderData) {
return Optional.of(placeholderData);
} else if (property instanceof PlaceholderDataFactory placeholderDataFactory) {
return Optional.of(placeholderDataFactory.create(customPlaceholderRegistry, options, this));
} else if (bean.equals(property)) {
logger.debug("Placeholder {} resolved to self", placeholderName);
return Optional.of(new IterablePlaceholderData(List.of(new ReflectionResolver(bean, customPlaceholderRegistry, options, this)), 1));
Expand Down Expand Up @@ -394,8 +399,6 @@ private Optional<PlaceholderData> resolveSimplePlaceholder(Object property, Stri
} else {
return Optional.of(new ScalarPlaceholderData<>(enumProperty));
}
} else if (property instanceof PlaceholderData placeholderData) {
return Optional.of(placeholderData);
} else if (isFieldAnnotatedWith(bean.getClass(), placeholderName, Translatable.class)) {
return getObjectTranslation(placeholderName, locale, options);
} else if (property instanceof Enum || property instanceof String || ReflectionUtils.isWrapperType(property.getClass())) {
Expand Down
@@ -0,0 +1,12 @@
package com.docutools.jocument.impl.excel.util;

import com.docutools.jocument.CustomPlaceholderRegistry;
import com.docutools.jocument.GenerationOptions;
import com.docutools.jocument.PlaceholderData;
import com.docutools.jocument.PlaceholderResolver;

public interface PlaceholderDataFactory {
PlaceholderData create(CustomPlaceholderRegistry customPlaceholderRegistry,
GenerationOptions options,
PlaceholderResolver parent);
}
Expand Up @@ -470,4 +470,26 @@ void shouldResolveIPWithToStringWhenNoLoop() throws InterruptedException, IOExce
var documentWrapper = new XWPFDocumentWrapper(xwpfDocument);
assertThat(documentWrapper.bodyElement(0).asParagraph().text(), containsString(SampleModelData.PICARD.getOfficer().toString()));
}

@Test
@DisplayName("Resolve custom placeholder in custom placeholderdata")
void shouldResolveCustomPlaceholderInCustomPlaceholderData() throws InterruptedException, IOException {
// assemble
Template template = Template.fromClassPath("/templates/word/CustomPlaceholderInCustomData.docx")
.orElseThrow();
CustomPlaceholderRegistry customPlaceholderRegistry = new CustomPlaceholderRegistryImpl();
customPlaceholderRegistry.addHandler("quote", QuotePlaceholder.class);
PlaceholderResolver resolver = new ReflectionResolver(SampleModelData.PLANET, customPlaceholderRegistry);

// act
Document document = template.startGeneration(resolver);
document.blockUntilCompletion(60000L); // 1 minute

// assert
assertThat(document.completed(), is(true));
xwpfDocument = TestUtils.getXWPFDocumentFromDocument(document);
var documentWrapper = new XWPFDocumentWrapper(xwpfDocument);
assertThat(documentWrapper.bodyElement(0).asParagraph().run(0).text(),
equalTo("Live your life not celebrating victories, but overcoming defeats."));
}
}
6 changes: 6 additions & 0 deletions src/test/java/com/docutools/jocument/sample/model/Planet.java
@@ -0,0 +1,6 @@
package com.docutools.jocument.sample.model;

import com.docutools.jocument.impl.excel.util.PlaceholderDataFactory;

public record Planet(PlaceholderDataFactory cities) {
}
@@ -1,5 +1,12 @@
package com.docutools.jocument.sample.model;

import com.docutools.jocument.CustomPlaceholderRegistry;
import com.docutools.jocument.GenerationOptions;
import com.docutools.jocument.PlaceholderData;
import com.docutools.jocument.PlaceholderResolver;
import com.docutools.jocument.impl.IterablePlaceholderData;
import com.docutools.jocument.impl.ReflectionResolver;
import com.docutools.jocument.impl.excel.util.PlaceholderDataFactory;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.time.LocalDate;
Expand All @@ -17,6 +24,7 @@ public class SampleModelData {
public static final List<Captain> CAPTAINS;
public static final Ship ENTERPRISE;
public static final Ship ENTERPRISE_WITHOUT_SERVICES;
public static final Planet PLANET;

static {
try {
Expand All @@ -41,6 +49,12 @@ public class SampleModelData {
CompletableFuture.completedFuture(services),
CompletableFuture.completedFuture(Path.of(SampleModelData.class.getResource("/images/picardProfileLarge.jpg").toURI())));
ENTERPRISE_WITHOUT_SERVICES = new Ship("USS Enterprise", PICARD, 5, Collections.emptyList(), LocalDate.now(), Optional.empty());
PLANET = new Planet(new PlaceholderDataFactory() {
@Override
public PlaceholderData create(CustomPlaceholderRegistry customPlaceholderRegistry, GenerationOptions options, PlaceholderResolver parent) {
return new IterablePlaceholderData(new ReflectionResolver(PICARD, customPlaceholderRegistry, options, parent));
}
});
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
Expand Down
Binary file not shown.

0 comments on commit 3fed2dc

Please sign in to comment.