package ch.uzh.ifi.attempto.acewiki.gf;
import ch.uzh.ifi.attempto.acewiki.core.AceWikiGrammarEditor;
import ch.uzh.ifi.attempto.acewiki.core.Article;
import ch.uzh.ifi.attempto.acewiki.core.GeneralTopic;
import ch.uzh.ifi.attempto.acewiki.core.GrammarEditorResult;
import ch.uzh.ifi.attempto.acewiki.core.Ontology;
import ch.uzh.ifi.attempto.acewiki.core.Sentence;
import ch.uzh.ifi.attempto.gfservice.GfServiceException;
import ch.uzh.ifi.attempto.gfservice.GfStorageResult;
public class GfGrammarEditor implements AceWikiGrammarEditor {
private final GfGrammar mGfGrammar;
public GfGrammarEditor(GfGrammar gfGrammar) {
mGfGrammar = gfGrammar;
}
@Override
public GrammarEditorResult update(Ontology ontology) {
final GfStorageResult result;
try {
result = mGfGrammar.update();
if (result.isSuccess()) {
clearAllLinearizations(ontology);
}
} catch (GfServiceException e) {
throw new RuntimeException(e);
}
return new GrammarEditorResult() {
@Override
public boolean isSuccess() {
return result.isSuccess();
}
@Override
public String getResultCode() {
return result.getResultCode();
}
@Override
public String getCommand() {
return result.getCommand();
}
@Override
public String getMessage() {
return result.getMessage();
}
};
}
@Override
public boolean isEditable() {
return mGfGrammar.isGrammarEditable();
}
/**
* Clears all the multilingual linearizations of all the sentences
* in the whole wiki. This is called after grammar update to make sure
* that the sentences reflect the actual grammar.
*
* TODO: this should be replaced by something smarter, which only clears the
* linearizations of affected trees.
*/
private static void clearAllLinearizations(Ontology ontology) {
for (GeneralTopic el : ontology.getOntologyElements(GeneralTopic.class)) {
Article article = el.getArticle();
for (Sentence sent : article.getSentences()) {
if (sent instanceof GfSentence) {
((GfSentence) sent).clearLinearizations();
}
}
}
}
}