-
Notifications
You must be signed in to change notification settings - Fork 4
/
ConstructTextualViewModule.java
146 lines (112 loc) · 5.4 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
146
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;
@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", comment = "Replace context flag. Default value is false.")
private boolean isReplace = false;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "serialize-unanswered-questions",
comment = "If true (default), outputs questions not having answers")
private boolean isSerializeUnansweredQuestions = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "serialize-answers",
comment = "If true (default), outputs answers not only questions")
private boolean isSerializeAnswers = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "process-non-root-questions",
comment = "If true (default), process all questions, otherwise process only root questions")
private boolean isProcessNonRootQuestions = true;
@Parameter(urlPrefix = FORM_MODULE.uri, name = "indentation-string",
comment = "Indentation string indents subquestion from questions. By default ' ' is used.")
private String indentationString = " ";
@Parameter(urlPrefix = FORM_MODULE.uri, name = "language",
comment = "Language to be used to retrieve labels of questions. By default 'en' is used.")
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();
}
}