Log in Help
Print
Homereleasesgate-5.1-beta2-build3402-ALLpluginsOntology_OWLIM2srcgatecreoleontologyowlim 〉 OEvent.java
 
package gate.creole.ontology.owlim;

import gate.util.GateRuntimeException;

/**
 * Ontology Event describes a change in the ontology.
 * 
 * @author niraj
 */
public class OEvent {

  /**
   * Contruction
   * 
   * @param subject - affected subject. Can be * if referring to all
   *          values.
   * @param predicate - affected predicate. Can be * if referring to all
   *          values.
   * @param object - affected object. Can be * if referring to all
   *          value.
   * @param toAdd - indicates if this statement is added to or removed
   *          from the ontology.
   */
  public OEvent(String subject, String predicate, String object, boolean toAdd) {
    this.subject = subject == null ? "*" : subject;
    this.predicate = predicate == null ? "*" : predicate;
    this.object = object == null ? "*" : object;
    this.toAdd = toAdd;
  }

  /**
   * Contruction
   * 
   * @param subject - affected subject. Can be * if referring to all
   *          values.
   * @param predicate - affected predicate. Can be * if referring to all
   *          values.
   * @param object - affected object. Can be * if referring to all
   *          value.
   * @param datatype - if the object value refers to a literal, one
   *          needs to specify the datatype.
   * @param toAdd - indicates if this statement is added to or removed
   *          from the ontology.
   */
  public OEvent(String subject, String predicate, String object,
          String datatype, boolean toAdd) {
    this(subject, predicate, object, toAdd);
    this.datatype = datatype == null ? "*" : datatype;
  }

  /**
   * Given a toString() representation of an an event, this method
   * converts it into the OEvent object.
   * 
   * @param eventDesc
   * @return an instance of OEvent class.
   */
  public static OEvent parseEvent(String eventDesc) {
    // the first character is either - or +
    char c = eventDesc.charAt(0);
    boolean add = c == '-' ? false : true;
    String neventDesc = eventDesc.substring(3, eventDesc.length() - 1);
    // each string is delimited with "> <"
    String parts[] = neventDesc.split("> <");

    if(parts.length == 3) {
      return new OEvent(removeEscapeChar(parts[0]), removeEscapeChar(parts[1]),
              removeEscapeChar(parts[2]), add);
    }
    else if(parts.length == 4) {
      return new OEvent(removeEscapeChar(parts[0]), removeEscapeChar(parts[1]),
              removeEscapeChar(parts[2]), removeEscapeChar(parts[3]), add);
    }
    else {
      throw new GateRuntimeException("Invalid event description " + eventDesc);
    }
  }

  /**
   * This method removes the \ before the escaped characters.
   * 
   * @param string
   * @return
   */
  private static String removeEscapeChar(String string) {
    String toReturn = "";
    if(string.equals("*")) return string;
    string = string.substring(0, string.length());
    for(int i = 0; i < string.length(); i++) {
      char c = string.charAt(i);
      if(c == '\\') {
        // check if the next character is ", < or >
        if(i + 1 < string.length()) {
          char ch1 = string.charAt(i + 1);
          if(ch1 == '"' || ch1 == '<' || ch1 == '>') {
            toReturn += ch1;
            i++;
            continue;
          }
        }
      }
      toReturn += c;
    }
    return toReturn;
  }

  /**
   * Gives a string representation for the OEvent instances. This is
   * what is stored in the changelog for every instance of OEvent.
   */
  public String toString() {
    // lets replace any " with \", new line with space
    String subject1 = "<" + getEscapedString(subject) + ">";
    String predicate1 = "<" + getEscapedString(predicate) + ">";
    String object1 = "<" + getEscapedString(object) + ">";
    String datatype1 = datatype == null ? null : "<"
            + getEscapedString(datatype) + ">";

    return (toAdd ? "+" : "-") + " " + subject1 + " " + predicate1 + " "
            + object1 + (datatype1 == null ? "" : " " + datatype1);
  }

  /**
   * Escapes the characters which are part of the changelog syntax.
   * 
   * @param string
   * @return
   */
  private String getEscapedString(String string) {
    String toReturn = "";
    for(char c : string.toCharArray()) {
      if(c == '"') {
        toReturn += "\\\"";
      }
      else if(c == '<') {
        toReturn += "\\<";
      }
      else if(c == '>') {
        toReturn += "\\>";
      }
      else if(c == '\n') {
        toReturn += " ";
      }
      else {
        toReturn += c + "";
      }
    }
    return toReturn;
  }

  /**
   * Subject in the triple that this event refers to.
   */
  private String subject;

  /**
   * Predicate in the triple that this event refers to.
   */
  private String predicate;

  /**
   * Object in the triple that this event refers to.
   */
  private String object;

  /**
   * Datatype in the triple that this event refers to.
   */
  private String datatype;

  /**
   * Indicates if this triple was added to or deleted from the ontology.
   */
  private boolean toAdd;

  /**
   * Returns the value of subject in the triple this event object refers
   * to.
   * 
   * @return
   */
  public String getSubject() {
    return subject;
  }

  /**
   * Sets the value for subject in the triple this event object refers
   * to.
   * 
   * @param subject
   */
  public void setSubject(String subject) {
    this.subject = subject;
  }

  /**
   * Returns the value of predicate in the triple this event object
   * refers to.
   * 
   * @return
   */
  public String getPredicate() {
    return predicate;
  }

  /**
   * Sets the value for predicate in the triple this event object refers
   * to.
   * 
   * @param predicate
   */
  public void setPredicate(String predicate) {
    this.predicate = predicate;
  }

  /**
   * Returns the value of object in the triple this event object refers
   * to.
   * 
   * @return
   */
  public String getObject() {
    return object;
  }

  /**
   * Sets the value for object in the triple this event object refers
   * to.
   * 
   * @param object
   */
  public void setObject(String object) {
    this.object = object;
  }

  /**
   * Returns the value of datatype in the triple this event object
   * refers to.
   * 
   * @return
   */
  public String getDatatype() {
    return datatype;
  }

  /**
   * Sets the value for datatype in the triple this event object refers
   * to.
   * 
   * @param datatype
   */
  public void setDatatype(String datatype) {
    this.datatype = datatype;
  }

  /**
   * Returns true if this triple is to be added or has been added to the
   * ontology, false otherwise.
   * 
   * @return
   */
  public boolean getToAdd() {
    return toAdd;
  }

  /**
   * If sets to true, indicates that this triple should be added/has
   * been added to the ontology. It should be set to false otherwise.
   * 
   * @param toAdd
   */
  public void setToAdd(boolean toAdd) {
    this.toAdd = toAdd;
  }

}