package projectv1a; import java.util.Vector; /** * * Clase CommunicationInterface * * Contiene toda la funcionalidad de la herramienta. Esta clase permite que la * funcionalidad de IKAT se pueda utilizar bien desde la interfaz gráfica o bien * desde otra herramienta. * * Class Specialization * A type generalization * B type generalization * New class superclass relation * Remove class superclass relation * Change precedence order * Change superclass * A type Class Removal * B type Class Removal * C type Class Removal */ public class CommunicationInterface { private OntologyLibrary ontologyLibrary; private CurrentOntologies currentOntologies; // atributo que será clave en la base de datos private int identity; private boolean found; // para saber si algo se ha encontrado o no private Vector instanceList; private InstanceList iL; private Vector instances; private ClassSpecification c; // DATOS MIEMBRO PARA -A TYPE GENERALIZATION- private Vector classes; private AttributeSpecification at; // DATOS MIEMBRO PARA -NEW CLASS-SUPERCLASS RELATION- private OntologyManager oM; private KBManager kbM; private ClassSpecification root; private ClassSpecification tmpClass; ///////////// CONSTRUCTORES ///////////// public CommunicationInterface() { } public CommunicationInterface(OntologyLibrary oL, CurrentOntologies cO) { ontologyLibrary = oL; currentOntologies = cO; } ///////////////////////////////////////// public void setId(int i){ identity = i; } public int getId(){ return identity; } public void setOL(OntologyLibrary o){ ontologyLibrary = o; } public OntologyLibrary getOL(){ return ontologyLibrary; } public void setCO(CurrentOntologies o){ currentOntologies = o; } public CurrentOntologies getCO(){ return currentOntologies; } /** * classSpecialization * * @param className - Vector con objetos de tipo String, con el nombre de las nuevas subclases * @param criterion - Vector con objetos de tipo Criterion * @param c - La clase que vamos a especializar */ public void classSpecialization(Vector className, Vector criterion, ClassSpecification c){ // c debe ser una clase hoja, lo comprobamos antes de iniciar ninguna operación if(!c.leafClass()){ System.out.println("The class that you have choose to specializate is not a leaf class. Aborting the operation."); } else { //Creamos el vector en el que almacenaremos las instaceList de las especializaciones antes de introducirlas en la Ontología instanceList = new Vector(className.size()); // Buscamos la InstanceList de la clase c found = false; iL = currentOntologies.searchIL(c); for(int i=0; i 1){// tiene varias superclases // Borramos de las clases superc y subc que estan relacionadas. subc.deleteSuperclass(superc); superc.deleteSubclass(subc); // Hay que buscar las instancias de subc y sus descendientes para eliminar de ellas los atributos de superc. searchInstancesDelete(superc, subc); } else { if (superc.getSuperClasses().isEmpty()){// La superclase es la raiz. No permitimos la operación. System.out.println("It is not allowed to remove this relation, excepting the root class, the rest must have a superclass"); } else { // Necesitamos confirmación para continuar // La clase tiene una única superclase, al ser eliminada esa relación su superclase será la raiz. // Hay que buscar en la ontología aquella clase que no tenga superclases(La raiz) iL = currentOntologies.searchIL(c); // Dentro de currentOntologies, en oM tenemos almacenada la ontología en la que están las clases con las que trabajamos. root = currentOntologies.getRoot(); // Añadimos la clase root a las superclases de subc subc.addSuperClass(root); // Añadimos la clase subc a las subclases de root root.addSubClass(subc); // Ahora hay que quitar los atributos de superc de las instancias de subc // haremos lo propio con las superclases de superc a excepción de root. // Lo más adecuado es ayudarnos de un método recursivo. deleteAttributesFromSCs(superc, subc); } } } /** * searchInstancesDelete(ClassSpecification sc, ClassSpecification c) * * Es un método recursivo, ya que es la forma más eficiente de ejecutar el * método deleteAttributes para todas las instancias de clases descendientes a * a subC. * * Funciona de forma analoga a searchInstances porque tambien llama al un * metodo, en este caso deleteAttributes pero a su vez este funciona igual * que el metodo addAttributes. * * El parametro "sc" representa a superC, es decir, a la superclase nueva. * El parametro "c" representa a subC en la primera ejecución pero en * posteriores ejecuciónes irá tomando el valor de la clase a cuyas instancias * les estamos eliminando los atributos de superC. */ private void searchInstancesDelete(ClassSpecification sc, ClassSpecification c){ deleteAttributes(sc, c); if(!c.getSubClasses().isEmpty()){ for(int i=0; i1){ // Borramos de las clases superc y subc que estan relacionadas. ((ClassSpecification)c.getSubClasses().get(m)).deleteSuperclass(c); c.deleteSubclass(((ClassSpecification)c.getSubClasses().get(m))); // Hay que buscar las instancias de subc y sus descendientes para eliminar de ellas los atributos de superc. /* Aquí */ searchInstancesDelete(c, (ClassSpecification)c.getSubClasses().get(m)); /*Corregido*/ reAddAttributes(((ClassSpecification)c.getSubClasses().get(m))); } else { // Si c es la única superclase de la subclase de c lo que hacemos es eliminar esa subclase // primero eliminamos los atributos de c de las instancias de las subclases de c POR SI HAY HERENCIA DE VARIOS NIVELES searchInstancesDelete(c, (ClassSpecification)c.getSubClasses().get(m)); removeInCascade((ClassSpecification)c.getSubClasses().get(m)); } } // Hay que eliminar la clase c de la ontología y sus instancias de la Base de Conocimientos currentOntologies.getOM().getOntologyVersion().getOntology().deleteClass(c); // Lo eliminamos de la ontología currentOntologies.getKBM().getKBVersion().getKB().deleteInstanceList(iL); // Borramos la InstanceList de la Base de Conocimientos for(int i=0; i