-
Notifications
You must be signed in to change notification settings - Fork 4
/
ConstructTextualViewModule.java
145 lines (111 loc) · 5.03 KB
/
ConstructTextualViewModule.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package cz.cvut.spipes.modules;
import cz.cvut.kbss.jopa.model.EntityManager;
import cz.cvut.kbss.jopa.model.EntityManagerFactory;
import cz.cvut.sforms.SFormsVocabularyJena;
import cz.cvut.sforms.model.Question;
import cz.cvut.sforms.transformation.SForms2TextTransformer;
import cz.cvut.sforms.transformation.TextTransformerConfig;
import cz.cvut.sforms.util.FormUtils;
import cz.cvut.spipes.constants.KBSS_MODULE;
import cz.cvut.spipes.constants.SML;
import cz.cvut.spipes.engine.ExecutionContext;
import cz.cvut.spipes.form.JenaFormUtils;
import cz.cvut.spipes.form.JopaPersistenceUtils;
import cz.cvut.spipes.modules.annotations.SPipesModule;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.function.Predicate;
/**
* For input Q&A models constructs textual view of specified questions. Each textual view represent the question
* and its sub-questions recursively.
*/
@SPipesModule(label = "construct textual view", comment =
"For input Q&A models constructs textual view of specified questions. Each textual" +
" view represent the question and its sub-questions recursively."
)
public class ConstructTextualViewModule extends AnnotatedAbstractModule {
private static final Logger LOG = LoggerFactory.getLogger(ConstructTextualViewModule.class);
private static final String TYPE_URI = KBSS_MODULE.uri + "construct-textual-view";
@Parameter(urlPrefix = SML.uri, name = "replace")
private boolean isReplace = false;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "serialize-unanswered-questions")
private boolean isSerializeUnansweredQuestions = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "serialize-answers")
private boolean isSerializeAnswers = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "process-non-root-questions")
private boolean isProcessNonRootQuestions = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "indentation-string")
private String indentationString = " ";
@Parameter(urlPrefix = FORM_MODULE.uri, name = "language")
private String language = "en";
@Override
ExecutionContext executeSelf() {
Model inpModel = this.getExecutionContext().getDefaultModel();
List<Resource> questions = getQuestions(inpModel, isProcessNonRootQuestions);
LOG.debug("Found {} questions.", questions.size());
if (LOG.isTraceEnabled()) {
LOG.trace("Found questions: {}", questions);
}
Model constructedModel = ModelFactory.createDefaultModel();
EntityManagerFactory emf = JopaPersistenceUtils.createEntityManagerFactoryWithMemoryStore(
FormUtils.SFORMS_MODEL_PACKAGE_NAME,
language
);
EntityManager em = emf.createEntityManager();
JopaPersistenceUtils.getDataset(em).setDefaultModel(inpModel);
TextTransformerConfig cfg = new TextTransformerConfig();
cfg.setSerializeAnswers(this.isSerializeAnswers);
cfg.setSerializeUnansweredQuestions(this.isSerializeUnansweredQuestions);
cfg.setIndentationString(this.indentationString);
SForms2TextTransformer t = new SForms2TextTransformer();
for (Resource qR: questions) {
Question q = em.find(Question.class, qR.getURI());
constructedModel.add(
qR,
SFormsVocabularyJena.s_p_textual_view,
t.serialize(q, cfg)
);
}
return createOutputContext(isReplace, constructedModel);
}
public boolean isSerializeUnansweredQuestions() {
return isSerializeUnansweredQuestions;
}
public void setSerializeUnansweredQuestions(boolean serializeUnansweredQuestions) {
isSerializeUnansweredQuestions = serializeUnansweredQuestions;
}
public boolean isProcessNonRootQuestions() {
return isProcessNonRootQuestions;
}
public void setProcessNonRootQuestions(boolean processNonRootQuestions) {
isProcessNonRootQuestions = processNonRootQuestions;
}
public String getIndentationString() {
return indentationString;
}
public void setIndentationString(String indentationString) {
this.indentationString = indentationString;
}
public boolean isReplace() {
return isReplace;
}
public void setReplace(boolean replace) {
isReplace = replace;
}
@Override
public String getTypeURI() {
return TYPE_URI;
}
private List<Resource> getQuestions(Model formModel, boolean isProcessNonRootQuestions) {
Predicate<Resource> isRootQuestion =
q -> ! formModel.listResourcesWithProperty(
SFormsVocabularyJena.s_p_has_related_question, q).hasNext();
Predicate<Resource> shouldProcessNonRootQuestions = q -> isProcessNonRootQuestions;
return JenaFormUtils.getQuestions(formModel)
.filterKeep(shouldProcessNonRootQuestions.or(isRootQuestion)).toList();
}
}