content: // 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.aceowl;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.List;
  
  import ch.uzh.ifi.attempto.acewiki.owl.OWLRelation;
  import ch.uzh.ifi.attempto.ape.LexiconEntry;
  import ch.uzh.ifi.attempto.chartparser.LexicalRule;
  
  /**
   * This class stands for relations that are represented by transitive verbs in ACE and object
   * properties in OWL. Transitive verbs have three word forms: a third singular form, a bare
   * infinitive form, and a passive form. The bare infinitive form is used in the case of negation
   * and plural. The passive form always ends with the word "by".
   *<p>
   * 0: third singular form.
   * 1: bare infinitive form.
   * 2: passive form.
   *<p>
   * Examples: ["gives", "give", "given by"]; ["knows", "know", "known by"].
   * 
   * @author Tobias Kuhn
   */
  public class VerbRelation extends OWLRelation implements ACEOWLOntoElement {
  	
  	private String thirdSg, inf, passive;
  	
  	/**
  	 * Creates a new verb relation.
  	 */
  	public VerbRelation() {
  	}
  	
  	public String[] getWords() {
  		return new String[] {thirdSg, inf, passive};
  	}
  
  	public void setWords(String serializedWords) {
  		String[] words = serializedWords.split(";");
  		thirdSg = words[0];
  		inf = words[1];
  		if (words.length < 3 || words[2] == null) {
  			passive = null;
  		} else if (words[2].endsWith(" by")) {
  			passive = words[2];
  		} else {
  			passive = words[2] + " by";
  		}
  		if (passive != null && passive.length() == 0) {
  			passive = null;
  		}
  	}
  	
  	public String serializeWords() {
  		return thirdSg + ";" + inf + ";" + (passive == null ? "" : passive) + ";";
  	}
  	
  	/**
  	 * Returns the past participle which is the passive form without the "by".
  	 * E.g. for the passive form "given by", the past participle is "given".
  	 * 
  	 * @return The past participle form.
  	 */
  	public String getPastPart() {
  		String s = getWord(2);
  		if (s == null) {
  			return null;
  		} else if (s.endsWith(" by")) {
  			return s.substring(0, s.length()-3);
  		} else {
  			throw new RuntimeException("Illegal passive word form: " + s);
  		}
  	}
  	
  	public String getIRISuffix() {
  		return getWord(1);
  	}
  	
  	public List<LexiconEntry> getLexiconEntries() {
  		List<LexiconEntry> entries = new ArrayList<LexiconEntry>();
  		entries.add(LexiconEntry.createTrVerbThirdEntry(thirdSg, inf));
  		entries.add(LexiconEntry.createTrVerbInfEntry(inf, inf));
  		if (passive != null) {
  			entries.add(LexiconEntry.createTrVerbPPEntry(getPastPart(), inf));
  		}
  		return entries;
  	}
  	
  	public String getType() {
  		return "Verb";
  	}
  	
  	public String getInternalType() {
  		return "trverb";
  	}
  	
  	public void collectLexicalRules(String catName, Collection<LexicalRule> lexRules) {
  		if (catName == null || catName.equals("verbsg")) {
  			lexRules.add(new LexicalRule("verbsg", getWord(0)));
  		}
  		if (catName == null || catName.equals("verbinf")) {
  			lexRules.add(new LexicalRule("verbinf", getWord(1)));
  		}
  		if (catName == null || catName.equals("pverb")) {
  			if (getWord(2) != null) {
  				lexRules.add(new LexicalRule("pverb", getWord(2)));
  			}
  		}
  	}
  
  }
  