Log in Help
Print
Homereleasesgate-5.1-beta2-build3402-ALLpluginsOntologysrcgatecreoleontologyimpl 〉 OClassImpl.java
 
/*
 *  OClassImpl.java
 *
 *  Niraj Aswani, 09/March/07
 *
 *  $Id: OClassImpl.java 11600 2009-10-13 17:13:22Z johann_p $
 */
package gate.creole.ontology.impl;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import gate.creole.ontology.OConstants.Closure;
import gate.creole.ontology.OClass;
import gate.creole.ontology.OConstants;
import gate.creole.ontology.ONodeID;
import gate.creole.ontology.Ontology;
import gate.util.ClosableIterator;

/**
 * Implementation of the OClass interface
 * 
 * @author niraj
 * 
 */
public class OClassImpl extends OResourceImpl implements OClass {
  /**
   * Constructor
   * 
   * @param aURI
   * @param ontology
   * @param ontologyService
   */
  public OClassImpl(ONodeID aURI, Ontology ontology,
          OntologyService ontologyService) {
    super(aURI, ontology, ontologyService);
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#addSubClass(gate.creole.ontology.OClass)
   */
  public void addSubClass(OClass subClass) {
    // lets first check if the current class is a subclass of the
    // subClass. If so,
    // we don't allow this.
    if(this.equals(subClass)) {
      Utils
              .warning("addSubClass(subClass) : The super and sub classes are same.");
      return;
    }

    if(this.isSubClassOf(subClass, OConstants.Closure.TRANSITIVE_CLOSURE)) {
      Utils.warning(subClass.getONodeID().toString() + " is a super class of "
              + this.getONodeID().toTurtle());
      return;
    }

    if(this.isSuperClassOf(subClass, OConstants.Closure.DIRECT_CLOSURE)) {
      Utils.warning(subClass.getONodeID().toString()
              + " is already a sub class of " + this.getONodeID().toTurtle());
      return;
    }

    ontologyService.addSubClass(this.nodeId.toString(), subClass.getONodeID()
            .toString());
    ontology.fireResourceRelationChanged(this, subClass, OConstants.SUB_CLASS_ADDED_EVENT);
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#removeSubClass(gate.creole.ontology.OClass)
   */
  public void removeSubClass(OClass subClass) {

    if(this.equals(subClass)) {
      Utils
              .warning("addSubClass(subClass) : The super and sub classes are same.");
      return;
    }

    if(!subClass.isSubClassOf(this, OConstants.Closure.DIRECT_CLOSURE)) {
      Utils.warning(subClass.getONodeID().toString()
              + " is not a direct subclass of " + this.getONodeID().toTurtle());
      return;
    }

    ontologyService.removeSubClass(this.nodeId.toString(), subClass
            .getONodeID().toString());
    ontology.fireResourceRelationChanged(this, subClass, OConstants.SUB_CLASS_REMOVED_EVENT);  
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#getSubClassesOld(byte)
   */
  public Set<OClass> getSubClasses(byte closure) {
    //throw new UnsupportedOperationException("Method with these parameters not supported any more");
    gate.creole.ontology.OConstants.Closure theClosure =
        (closure == OConstants.DIRECT_CLOSURE) ?
      Closure.DIRECT_CLOSURE : Closure.TRANSITIVE_CLOSURE;
    return getSubClasses(theClosure);
  }

  public Set<OClass> getSubClasses(Closure closure) {
    return ontologyService.getSubClasses(this.nodeId,closure);
  }

  public ClosableIterator<OClass> getSubClassesIterator(Closure closure) {
    return ontologyService.getSubClassesIterator(this.nodeId, closure);
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#getSuperClasses(byte)
   */
  public Set<OClass> getSuperClasses(byte closure) {
    //throw new UnsupportedOperationException("Method with these parameters not supported any more");
    Closure theClosure = closure == OConstants.DIRECT_CLOSURE ?
      Closure.DIRECT_CLOSURE : Closure.TRANSITIVE_CLOSURE;
    return getSuperClasses(theClosure);
  }

  public Set<OClass> getSuperClasses(Closure closure) {
    ResourceInfo[] superClasses = ontologyService.getSuperClasses(
            this.nodeId.toString(), closure);
    Set<OClass> oClasses = new HashSet<OClass>();
    for(int i = 0; i < superClasses.length; i++) {
      oClasses.add(Utils.createOClass(this.ontology,
              this.ontologyService, superClasses[i].getUri(), superClasses[i]
                      .getClassType()));
    }
    return oClasses;
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#isSuperClassOf(gate.creole.ontology.OClass,
   *      byte)
   */
  @Deprecated
  public boolean isSuperClassOf(OClass aClass, byte closure) {
    //throw new UnsupportedOperationException("Method with these parameters not supported any more");
    Closure theClosure = Closure.TRANSITIVE_CLOSURE;
    if(closure == OConstants.DIRECT_CLOSURE) {
      theClosure = Closure.DIRECT_CLOSURE;
    }
    return ontologyService.isSuperClassOf(this.nodeId.toString(), aClass
            .getONodeID().toString(), theClosure);
  }

  public boolean isSuperClassOf(OClass aClass, Closure closure) {
    return ontologyService.isSuperClassOf(this.nodeId.toString(), aClass
            .getONodeID().toString(), closure);
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#isSubClassOf(gate.creole.ontology.OClass,
   *      byte)
   */
  @Deprecated
  public boolean isSubClassOf(OClass aClass, byte closure) {
    //throw new UnsupportedOperationException("Method with these parameters not supported any more");
    Closure theClosure = Closure.TRANSITIVE_CLOSURE;
    if(closure == OConstants.DIRECT_CLOSURE) {
      theClosure = Closure.DIRECT_CLOSURE;
    }
    return ontologyService.isSubClassOf(aClass.getONodeID().toString(),
            this.nodeId.toString(), theClosure);
  }

  public boolean isSubClassOf(OClass aClass, OConstants.Closure closure) {
      return ontologyService.isSubClassOf(aClass.getONodeID().toString(),
            this.nodeId.toString(), closure);

  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#isTopClass()
   */
  public boolean isTopClass() {
    return ontologyService.isTopClass(this.nodeId.toString());
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#setSameClassAs(gate.creole.ontology.OClass)
   */
  public void setEquivalentClassAs(OClass theClass) {
    // lets first check if the current class is a subclass of the
    // subClass. If so,
    // we don't allow this.
    if(this.equals(theClass)) {
      Utils
              .warning("setEquivalentClassAs(theClass) : Both the source and the argument classes refer to the same instance of class");
      return;
    }

    ontologyService.setEquivalentClassAs(this.nodeId.toString(), theClass
            .getONodeID().toString());
    ontology.fireResourceRelationChanged(this, theClass, OConstants.EQUIVALENT_CLASS_EVENT);
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#getSameClasses()
   */
  public Set<OClass> getEquivalentClasses() {
    ResourceInfo[] eqClasses = ontologyService.getEquivalentClasses(
            this.nodeId.toString());
    Set<OClass> oClasses = new HashSet<OClass>();
    for(int i = 0; i < eqClasses.length; i++) {
      oClasses.add(Utils.createOClass(this.ontology,
              this.ontologyService, eqClasses[i].getUri(), eqClasses[i].getClassType()));
    }
    return oClasses;
  }

  /*
   * (non-Javadoc)
   * 
   * @see gate.creole.ontology.OClass#isSameClassAs(gate.creole.ontology.OClass)
   */
  public boolean isEquivalentClassAs(OClass aClass) {
    return ontologyService.isEquivalentClassAs(this.nodeId.toString(),
            aClass.getONodeID().toString());
  }

  /**
   * Gets the super classes, and returns them in an array list where on
   * each index there is a collection of the super classes at distance -
   * the index.
   * @return
   */
  public ArrayList<Set<OClass>> getSuperClassesVSDistance() {
    ArrayList<Set<OClass>> result = new ArrayList<Set<OClass>>();
    Set<OClass> set;
    int level = 0;
    OClass c;
    Set<OClass> levelSet = new HashSet<OClass>();
    levelSet.add(this);
    boolean rollon = (0 < ontologyService.getSuperClasses(this.nodeId.toTurtle(),
            OConstants.Closure.DIRECT_CLOSURE).length);
    while(rollon) {
      set = new HashSet<OClass>();
      Iterator<OClass> li = levelSet.iterator();
      while(li.hasNext()) {
        c = li.next();
        set.addAll(c.getSuperClasses(OConstants.Closure.DIRECT_CLOSURE));
      }
      if(0 < set.size()) {
        result.add(level++, set);
      }
      levelSet = set;
      rollon = 0 < levelSet.size();
    }
    return result;
  }

  /**
   * Gets the sub classes, and returns them in an array list where on
   * each index there is a collection of the sub classes at distance -
   * the index.
   * @return
   */
  public ArrayList<Set<OClass>> getSubClassesVsDistance() {
    ArrayList<Set<OClass>> result = new ArrayList<Set<OClass>>();
    Set<OClass> set;
    int level = 0;
    OClass c;
    Set<OClass> levelSet = new HashSet<OClass>();
    levelSet.add(this);
    // TODO: this really just checks for existence and should be
    // done with a ask query .. something like hasSubClasses ..
    boolean rollon = (0 < ontologyService.getSubClasses(nodeId,
            OConstants.Closure.DIRECT_CLOSURE).size());
    while(rollon) {
      set = new HashSet<OClass>();
      Iterator<OClass> li = levelSet.iterator();
      while(li.hasNext()) {
        c = li.next();
        set.addAll(c.getSubClasses(OConstants.Closure.DIRECT_CLOSURE));
      }
      if(0 < set.size()) {
        result.add(level++, set);
      }
      levelSet = set;
      rollon = 0 < levelSet.size();
    }
    return result;
  }



}