summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java144
1 files changed, 144 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java b/container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java
new file mode 100644
index 00000000000..745a5ad85fe
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/prelude/templates/HitContext.java
@@ -0,0 +1,144 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.prelude.templates;
+
+import com.yahoo.prelude.hitfield.HitField;
+import com.yahoo.prelude.hitfield.JSONString;
+import com.yahoo.prelude.hitfield.XMLString;
+import com.yahoo.search.result.Hit;
+import com.yahoo.search.result.StructuredData;
+import com.yahoo.search.result.FeatureData;
+import com.yahoo.text.XML;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * A context providing all the fields of a hit, and falls back to MapContext behavior for all other keys.
+ *
+ * @author tonytv
+ */
+public class HitContext extends Context {
+
+ private final Hit hit;
+ private final Context fallbackContext;
+
+ public HitContext(Hit hit, Context fallbackContext) {
+ this.hit = hit;
+ this.fallbackContext = fallbackContext;
+ }
+
+ @Override
+ public Object put(String key, Object value) {
+ return fallbackContext.put(key, value);
+ }
+
+ @Override
+ public Object get(String key) {
+ Object value = normalizedHitProperty(key);
+ return value != null ?
+ value :
+ fallbackContext.get(key);
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return fallbackContext.remove(key);
+ }
+
+ @Override
+ public Collection<? extends Object> getKeys() {
+ Set<Object> keys = new HashSet<>(fallbackContext.getKeys());
+ keys.addAll(hit.fieldKeys());
+ return keys;
+ }
+
+ @Override
+ public void setBoldOpenTag(String boldOpenTag) {
+ fallbackContext.setBoldOpenTag(boldOpenTag);
+ }
+
+ @Override
+ public void setBoldCloseTag(String boldCloseTag) {
+ fallbackContext.setBoldCloseTag(boldCloseTag);
+ }
+
+ @Override
+ public void setSeparatorTag(String separatorTag) {
+ fallbackContext.setSeparatorTag(separatorTag);
+ }
+
+ @Override
+ public String getBoldOpenTag() {
+ return fallbackContext.getBoldOpenTag();
+ }
+
+ @Override
+ public String getBoldCloseTag() {
+ return fallbackContext.getBoldCloseTag();
+ }
+
+ @Override
+ public String getSeparatorTag() {
+ return fallbackContext.getSeparatorTag();
+ }
+
+ @Override
+ //TVT: TODO: Make this package private again.
+ public boolean isUtf8Output() {
+ return fallbackContext.isUtf8Output();
+ }
+
+ @Override
+ //TODO: TVT: make this package private again
+ public void setUtf8Output(boolean utf8Output) {
+ fallbackContext.setUtf8Output(utf8Output);
+ }
+
+ @Override
+ public void setXmlEscape(boolean xmlEscape) {
+ fallbackContext.setXmlEscape(xmlEscape);
+ }
+
+ @Override
+ public boolean getXmlEscape() {
+ return fallbackContext.getXmlEscape();
+ }
+
+ @Override
+ protected Object normalizeValue(Object value) {
+ return fallbackContext.normalizeValue(value);
+ }
+
+ private Object normalizedHitProperty(String key) {
+ Object value = hit.getField(key);
+ return value == null ?
+ null :
+ normalizeHitFieldValue(value);
+ }
+
+ private Object normalizeHitFieldValue(Object value) {
+ if (value instanceof HitField) {
+ HitField hf = (HitField) value;
+ if (getXmlEscape()) {
+ return hf.quotedContent(getBoldOpenTag(),
+ getBoldCloseTag(),
+ getSeparatorTag(),
+ true);
+ } else {
+ return hf.getContent(getBoldOpenTag(),
+ getBoldCloseTag(),
+ getSeparatorTag());
+ }
+ } else if (value instanceof StructuredData) {
+ return value.toString();
+ } else if (value instanceof XMLString || value instanceof JSONString) {
+ return value.toString();
+ } else if (getXmlEscape()) {
+ return XML.xmlEscape(value.toString(), true, null);
+ } else {
+ return value.toString();
+ }
+ }
+
+}