-
Notifications
You must be signed in to change notification settings - Fork 166
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
issue #520: provide option to customize stock extensions
- Loading branch information
Showing
4 changed files
with
218 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
pebble/src/main/java/com/mitchellbosecke/pebble/extension/ExtensionCustomizer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
package com.mitchellbosecke.pebble.extension; | ||
|
||
import com.mitchellbosecke.pebble.attributes.AttributeResolver; | ||
import com.mitchellbosecke.pebble.operator.BinaryOperator; | ||
import com.mitchellbosecke.pebble.operator.UnaryOperator; | ||
import com.mitchellbosecke.pebble.tokenParser.TokenParser; | ||
|
||
import java.util.List; | ||
import java.util.Map; | ||
|
||
public abstract class ExtensionCustomizer implements Extension { | ||
|
||
private final Extension delegate; | ||
|
||
public ExtensionCustomizer(Extension delegate) { | ||
this.delegate = delegate; | ||
} | ||
|
||
@Override | ||
public Map<String, Filter> getFilters() { | ||
return delegate.getFilters(); | ||
} | ||
|
||
@Override | ||
public Map<String, Test> getTests() { | ||
return delegate.getTests(); | ||
} | ||
|
||
@Override | ||
public Map<String, Function> getFunctions() { | ||
return delegate.getFunctions(); | ||
} | ||
|
||
@Override | ||
public List<TokenParser> getTokenParsers() { | ||
return delegate.getTokenParsers(); | ||
} | ||
|
||
@Override | ||
public List<BinaryOperator> getBinaryOperators() { | ||
return delegate.getBinaryOperators(); | ||
} | ||
|
||
@Override | ||
public List<UnaryOperator> getUnaryOperators() { | ||
return delegate.getUnaryOperators(); | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getGlobalVariables() { | ||
return delegate.getGlobalVariables(); | ||
} | ||
|
||
@Override | ||
public List<NodeVisitorFactory> getNodeVisitors() { | ||
return delegate.getNodeVisitors(); | ||
} | ||
|
||
@Override | ||
public List<AttributeResolver> getAttributeResolver() { | ||
return delegate.getAttributeResolver(); | ||
} | ||
|
||
} |
72 changes: 72 additions & 0 deletions
72
pebble/src/main/java/com/mitchellbosecke/pebble/extension/ExtensionRegistryFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
package com.mitchellbosecke.pebble.extension; | ||
|
||
import com.mitchellbosecke.pebble.extension.core.AttributeResolverExtension; | ||
import com.mitchellbosecke.pebble.extension.core.CoreExtension; | ||
import com.mitchellbosecke.pebble.extension.escaper.EscaperExtension; | ||
import com.mitchellbosecke.pebble.extension.escaper.EscapingStrategy; | ||
import com.mitchellbosecke.pebble.extension.i18n.I18nExtension; | ||
|
||
import java.util.*; | ||
import java.util.function.Function; | ||
import java.util.stream.Stream; | ||
|
||
public class ExtensionRegistryFactory { | ||
|
||
private final List<Extension> userProvidedExtensions = new ArrayList<>(); | ||
|
||
private final EscaperExtension escaperExtension = new EscaperExtension(); | ||
|
||
private boolean allowOverrideCoreOperators = false; | ||
|
||
private Map<Class<? extends Extension>, Function<Extension, Extension>> customizers = new HashMap<>(); | ||
|
||
public ExtensionRegistry buildExtensionRegistry() { | ||
ExtensionRegistry extensionRegistry = new ExtensionRegistry(); | ||
|
||
Stream.of(new CoreExtension(), this.escaperExtension, new I18nExtension()) | ||
.map(this::applyCustomizer) | ||
.forEach(extensionRegistry::addExtension); | ||
|
||
for (Extension userProvidedExtension : this.userProvidedExtensions) { | ||
if (this.allowOverrideCoreOperators) { | ||
extensionRegistry.addOperatorOverridingExtension(userProvidedExtension); | ||
} else { | ||
extensionRegistry.addExtension(userProvidedExtension); | ||
} | ||
} | ||
|
||
extensionRegistry.addExtension(new AttributeResolverExtension()); | ||
|
||
return extensionRegistry; | ||
} | ||
|
||
private Extension applyCustomizer(Extension coreExtension) { | ||
return customizers.getOrDefault(coreExtension.getClass(), Function.identity()) | ||
.apply(coreExtension); | ||
} | ||
|
||
public void autoEscaping(boolean autoEscaping) { | ||
this.escaperExtension.setAutoEscaping(autoEscaping); | ||
} | ||
|
||
public void addEscapingStrategy(String name, EscapingStrategy strategy) { | ||
this.escaperExtension.addEscapingStrategy(name, strategy); | ||
} | ||
|
||
public void extension(Extension... extensions) { | ||
Collections.addAll(this.userProvidedExtensions, extensions); | ||
} | ||
|
||
public void allowOverrideCoreOperators(boolean allowOverrideCoreOperators) { | ||
this.allowOverrideCoreOperators = allowOverrideCoreOperators; | ||
} | ||
|
||
public void defaultEscapingStrategy(String strategy) { | ||
this.escaperExtension.setDefaultStrategy(strategy); | ||
} | ||
|
||
public <T extends Extension> void addExtensionCustomizer(Class<T> clazz, Function<Extension, Extension> customizer) { | ||
this.customizers.put(clazz, customizer); | ||
} | ||
|
||
} |
55 changes: 55 additions & 0 deletions
55
pebble/src/test/java/com/mitchellbosecke/pebble/extension/ExtensionFactoryTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package com.mitchellbosecke.pebble.extension; | ||
|
||
import com.mitchellbosecke.pebble.PebbleEngine; | ||
import com.mitchellbosecke.pebble.error.PebbleException; | ||
import com.mitchellbosecke.pebble.extension.core.CoreExtension; | ||
import com.mitchellbosecke.pebble.template.PebbleTemplate; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
|
||
import java.io.IOException; | ||
import java.io.StringWriter; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
import static org.junit.jupiter.api.Assertions.assertThrows; | ||
import static org.junit.jupiter.api.Assertions.assertTrue; | ||
|
||
class ExtensionFactoryTest { | ||
|
||
PebbleEngine pebble; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
pebble = new PebbleEngine.Builder() | ||
.addExtensionCustomizer(CoreExtension.class, RemoveUpper::new) | ||
.build(); | ||
} | ||
|
||
@Test | ||
void upperFilterCannotBeUsed() throws IOException { | ||
Map<String, Object> obj = new HashMap<>(); | ||
obj.put("test", "abc"); | ||
PebbleTemplate template = pebble.getLiteralTemplate("{{ test | upper }}"); | ||
|
||
PebbleException exception = assertThrows(PebbleException.class, () -> template.evaluate(new StringWriter(), obj)); | ||
assertTrue(exception.getMessage().contains("upper"), | ||
() -> "Expect upper-Filter to not exist, actual Problem: " + exception.getMessage()); | ||
} | ||
|
||
private static class RemoveUpper extends ExtensionCustomizer { | ||
|
||
public RemoveUpper(Extension core) { | ||
super(core); | ||
} | ||
|
||
@Override | ||
public Map<String, Filter> getFilters() { | ||
Map<String, Filter> filters = new HashMap<>(super.getFilters()); | ||
filters.remove("upper"); | ||
return filters; | ||
} | ||
|
||
} | ||
|
||
} |