001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.aceowl;
016
017 import java.util.ArrayList;
018 import java.util.List;
019
020 import ch.uzh.ifi.attempto.acewiki.core.InvalidWordException;
021 import ch.uzh.ifi.attempto.acewiki.core.LanguageUtils;
022 import ch.uzh.ifi.attempto.acewiki.core.LexiconChanger;
023 import ch.uzh.ifi.attempto.acewiki.core.LexiconDetail;
024 import ch.uzh.ifi.attempto.acewiki.core.Ontology;
025 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
026 import ch.uzh.ifi.attempto.ape.FunctionWords;
027
028 /**
029 * This class is used to modify or create nouns.
030 *
031 * @author Tobias Kuhn
032 */
033 public class NounChanger implements LexiconChanger {
034
035 public String getDescription() {
036 return "Every noun represents a certain type of things. " +
037 "For example, the noun \"city\" stands for all things that are cities.";
038 }
039
040 public List<LexiconDetail> getDetails(OntologyElement el) {
041 NounConcept concept = (NounConcept) el;
042 List<LexiconDetail> l = new ArrayList<LexiconDetail>();
043 l.add(new LexiconDetail(
044 "singular",
045 "examples: woman, city, process",
046 concept.getWord(0)
047 ));
048 l.add(new LexiconDetail(
049 "plural",
050 "examples: women, cities, processes",
051 concept.getWord(1)
052 ));
053 return l;
054 }
055
056 public void save(OntologyElement el, int wordNumber, List<Object> newValues, Ontology ontology)
057 throws InvalidWordException {
058 NounConcept concept = (NounConcept) el;
059
060 String singular = ACEOWLLexicon.normalize((String) newValues.get(0));
061 String plural = ACEOWLLexicon.normalize((String) newValues.get(1));
062 String singularP = LanguageUtils.getPrettyPrinted(singular);
063 String pluralP = LanguageUtils.getPrettyPrinted(plural);
064
065 if (singular.equals(plural)) {
066 throw new InvalidWordException("Singular and plural form have to be distinct.");
067 }
068 if (singular.equals("")) {
069 throw new InvalidWordException("No singular form defined: Please specify the " +
070 "singular form.");
071 }
072 if (!ACEOWLLexicon.isValidWordOrEmpty(singular)) {
073 throw new InvalidWordException("Invalid character: Only a-z, A-Z, 0-9, -, and " +
074 "spaces are allowed, and the first character must be one of a-z A-Z.");
075 }
076 if (FunctionWords.isFunctionWord(singular)) {
077 throw new InvalidWordException("'" + singularP + "' is a predefined word and cannot " +
078 "be used here.");
079 }
080 OntologyElement oe = ontology.getElement(singular);
081 if (oe != null && oe != concept) {
082 throw new InvalidWordException("The word '" + singularP + "' is already used. " +
083 "Please use a different one.");
084 }
085 if (plural.equals("")) {
086 throw new InvalidWordException("No plural form defined: Please specify the plural " +
087 "form.");
088 }
089 if (!ACEOWLLexicon.isValidWordOrEmpty(plural)) {
090 throw new InvalidWordException("Invalid character: Only a-z, A-Z, 0-9, -, and " +
091 "spaces are allowed, and the first character must be one of a-z A-Z.");
092 }
093 if (FunctionWords.isFunctionWord(plural)) {
094 throw new InvalidWordException("'" + pluralP + "' is a predefined word and cannot " +
095 "be used here.");
096 }
097 oe = ontology.getElement(plural);
098 if (oe != null && oe != concept) {
099 throw new InvalidWordException("The word '" + pluralP + "' is already used. Please " +
100 "use a different one.");
101 }
102 ontology.change(concept, singular + ";" + plural);
103 }
104
105 }