// This file is part of AceWiki. // Copyright 2008-2013, AceWiki developers. // // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU // Lesser General Public License as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If // not, see http://www.gnu.org/licenses/. package ch.uzh.ifi.attempto.acewiki.gf; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import ch.uzh.ifi.attempto.acewiki.core.AbstractAceWikiEngine; import ch.uzh.ifi.attempto.acewiki.core.AceWikiGrammarEditor; import ch.uzh.ifi.attempto.acewiki.core.AceWikiReasoner; import ch.uzh.ifi.attempto.acewiki.core.Concept; import ch.uzh.ifi.attempto.acewiki.core.GeneralTopic; import ch.uzh.ifi.attempto.acewiki.core.Individual; import ch.uzh.ifi.attempto.acewiki.core.LanguageHandler; import ch.uzh.ifi.attempto.acewiki.core.Ontology; import ch.uzh.ifi.attempto.acewiki.core.OntologyElement; import ch.uzh.ifi.attempto.acewiki.core.Sentence; import ch.uzh.ifi.attempto.acewiki.owl.AceWikiOWLReasoner2; import ch.uzh.ifi.attempto.acewiki.owl.OWLFunctionalSyntaxExporter; import ch.uzh.ifi.attempto.acewiki.owl.OWLXMLExporter; /** * This AceWiki engine uses a GF (Grammatical Framework) grammar. * * @author Kaarel Kaljurand */ public class GfEngine extends AbstractAceWikiEngine { private AceWikiOWLReasoner2 reasoner = new AceWikiOWLReasoner2(); // TODO: support the creation of dynamic queries // public static final String TYPE_QUERY = "query"; private Map<String, GfHandler> languageHandlers = new HashMap<String, GfHandler>(); private String[] languages; private GfGrammar gfGrammar; private GfGrammarEditor gfGrammarEditor; /** * Creates a new GF-based AceWiki engine. */ public GfEngine() { addExporter(new GfReportExporter()); addExporter(new OWLFunctionalSyntaxExporter(true)); addExporter(new OWLFunctionalSyntaxExporter(false)); addExporter(new OWLXMLExporter(true)); addExporter(new OWLXMLExporter(false)); setLexicalTypes(GeneralTopic.NORMAL_TYPE, TypeGfModule.INTERNAL_TYPE); } public void init(Ontology ontology) { gfGrammar = new GfGrammar(ontology); gfGrammarEditor = new GfGrammarEditor(gfGrammar); Set<String> hiddenLanguages = ontology.getParameterAsSetOfString(GfParameters.HIDDEN_LANGUAGES); // Sort languages alphabetically according to displayed language name: List<String> languageNames = new ArrayList<>(); Map<String,String> languageMap = new HashMap<>(); for (String l : gfGrammar.getLanguages()) { if (! hiddenLanguages.contains(l)) { String n = getLanguageHandler(l).getLanguageName(); languageNames.add(n); languageMap.put(n, l); } } Collections.sort(languageNames); languages = new String[languageNames.size()]; int i = 0; for (String l : languageNames) { languages[i++] = languageMap.get(l); } super.init(ontology); } public LanguageHandler getLanguageHandler(String language) { GfHandler lh = languageHandlers.get(language); if (lh == null) { lh = new GfHandler(language, gfGrammar); languageHandlers.put(language, lh); } return lh; } public String[] getLanguages() { return languages; } /** * Returns the grammar object. * * @return The grammar object. */ public GfGrammar getGfGrammar() { return gfGrammar; } // TODO: implement a reasoner that does ACE reasoning if ACE is // one of the languages public AceWikiReasoner getReasoner() { return reasoner; } public OntologyElement createOntologyElement(String type) { if (GeneralTopic.NORMAL_TYPE.equals(type)) { return GeneralTopic.makeNormal(""); } else if (TypeGfModule.hasType(type)) { return new TypeGfModule(this); } return null; } public Sentence createSentence(String serialized) { return GfSentence.createGfSentence(gfGrammar, GfGrammar.deserialize(serialized)); } public Sentence createAssignmentSentence(Individual ind, Concept concept) { // TODO return null; } public Sentence createHierarchySentence(Concept subConcept, Concept superConcept) { // TODO return null; } @Override public AceWikiGrammarEditor getGrammarEditor() { return gfGrammarEditor; } }