//--------------------------------------------------------------------------------//
// COPYRIGHT NOTICE //
//--------------------------------------------------------------------------------//
// Copyright (c) 2012, Instituto de Microelectronica de Sevilla (IMSE-CNM) //
// //
// All rights reserved. //
// //
// Redistribution and use in source and binary forms, with or without //
// modification, are permitted provided that the following conditions are met: //
// //
// * Redistributions of source code must retain the above copyright notice, //
// this list of conditions and the following disclaimer. //
// //
// * Redistributions in binary form must reproduce the above copyright //
// notice, this list of conditions and the following disclaimer in the //
// documentation and/or other materials provided with the distribution. //
// //
// * Neither the name of the IMSE-CNM nor the names of its contributors may //
// be used to endorse or promote products derived from this software //
// without specific prior written permission. //
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" //
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE //
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE //
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE //
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL //
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR //
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER //
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, //
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE //
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //
//--------------------------------------------------------------------------------//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// PAQUETE DE OPERACIONES //
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
package xfuzzy.pkg;
import java.util.Vector;
import java.io.*;
public class PackageDefinition {
//----------------------------------------------------------------------------//
// CONSTANTES P�BLICAS //
//----------------------------------------------------------------------------//
public static final int BINARY = 0;
public static final int UNARY = 1;
public static final int DEFUZ = 2;
public static final int MFUNC = 3;
public static final int FAMILY = 4;
public static final int CRISP = 5;
//----------------------------------------------------------------------------//
// MIEMBROS PRIVADOS //
//----------------------------------------------------------------------------//
/**
* Nombre del paquete
*/
private String name;
/**
* Archivo en el que se describe el contenido del paquete
*/
private File file;
/**
* Lista de definiciones de funciones binarias
*/
private Vector binary;
/**
* Lista de definiciones de funciones unarias
*/
private Vector unary;
/**
* Lista de definiciones de funciones de pertenencia
*/
private Vector mfunc;
/**
* Lista de definiciones de m�todos de concreci�n
*/
private Vector defuz;
/**
* Lista de definiciones de familias de funciones de pertenencia
*/
private Vector family;
/**
* Lista de definiciones de funciones no difusas
*/
private Vector crisp;
/**
* Marcador que indica si existen modificaciones del paquete sin almacenar
*/
private boolean modified;
/**
* Ventana de edici�n del paquete (null si no se est� editando)
*/
private Object editor;
/**
* Listado de errores en la compilaci�n del paquete
*/
private String resume;
//----------------------------------------------------------------------------//
// CONSTRUCTOR //
//----------------------------------------------------------------------------//
/**
* Constructor
*/
public PackageDefinition(File file) {
String filename = file.getName();
int index = filename.toLowerCase().indexOf(".pkg");
if(index >0) this.name = filename.substring(0, index);
else this.name = new String(filename);
this.file = file;
this.binary = new Vector();
this.unary = new Vector();
this.defuz = new Vector();
this.mfunc = new Vector();
this.family = new Vector();
this.crisp = new Vector();
this.modified = false;
}
//----------------------------------------------------------------------------//
// M�TODOS P�BLICOS //
//----------------------------------------------------------------------------//
/**
* Obtiene el nombre del paquete
*/
public String toString() {
return this.name;
}
/**
* Compara una cadena con el nombre del paquete
*/
public boolean equals(String name) {
return this.name.equals(name);
}
/**
* A�ade una definicion al paquete
*/
public void add(Definition def, int kind) {
Vector vector = get(kind);
if(vector != null) vector.addElement(def);
}
/**
* Elimina una definici�n del paquete
*/
public boolean remove(Definition def, int kind) {
Vector vector = get(kind);
if(vector == null) return false;
return vector.removeElement(def);
}
/**
* Elimina una definici�n del paquete
*/
public boolean remove(String name, int kind) {
Vector vector = get(kind);
if(vector == null) return false;
Definition def = search(vector,name);
if(def == null) return false;
return vector.removeElement(def);
}
/**
* Estudia si el paquete contiene una definici�n dada
*/
public boolean contains(String name, int kind) {
Vector vector = get(kind);
Definition def = search(vector,name);
if(def == null) return false;
return true;
}
/**
* Obtiene una instancia de una definici�n
*/
public Object instantiate(String name, int kind) {
Vector vector = get(kind);
Definition def = search(vector,name);
if(def == null) return null;
return def.instantiate();
}
/**
* Obtiene la lista de definiciones de un cierto tipo
*/
public Vector get(int kind) {
switch(kind) {
case BINARY: return this.binary;
case UNARY: return this.unary;
case DEFUZ: return this.defuz;
case MFUNC: return this.mfunc;
case FAMILY: return this.family;
case CRISP: return this.crisp;
default: return null;
}
}
/**
* Busca una definici�n en una lista de definiciones
*/
public Definition search(Vector vector, String name) {
if(vector == null) return null;
for(int i=0, size = vector.size(); i<size; i++) {
Definition def = (Definition) vector.elementAt(i);
if(def.equals(name)) return def;
}
return null;
}
/**
* Obtiene el mensaje con los errores de compilaci�n
*/
public String resume() {
return this.resume;
}
/**
* Compila todas las definiciones del paquete
*/
public boolean compile() {
Vector v = new Vector();
for(int i=0, size=binary.size(); i<size; i++) {
Definition def = (Definition) binary.elementAt(i);
if(!def.compile()) v.addElement(def);
}
for(int i=0, size=unary.size(); i<size; i++) {
Definition def = (Definition) unary.elementAt(i);
if(!def.compile()) v.addElement(def);
}
for(int i=0, size=mfunc.size(); i<size; i++) {
Definition def = (Definition) mfunc.elementAt(i);
if(!def.compile()) v.addElement(def);
}
for(int i=0, size=defuz.size(); i<size; i++) {
Definition def = (Definition) defuz.elementAt(i);
if(!def.compile()) v.addElement(def);
}
for(int i=0, size=family.size(); i<size; i++) {
Definition def = (Definition) family.elementAt(i);
if(!def.compile()) v.addElement(def);
}
for(int i=0, size=crisp.size(); i<size; i++) {
Definition def = (Definition) crisp.elementAt(i);
if(!def.compile()) v.addElement(def);
}
String eol = System.getProperty("line.separator", "\n");
resume = "";
for(int i=0; i<v.size(); i++)
resume += "Can't compile "+v.elementAt(i)+"."+eol;
return (v.size()==0);
}
/**
* Elimina todos los ficheros creados al compilar
*/
public void unlink() {
for(int i=0, size=binary.size(); i<size; i++)
((Definition) binary.elementAt(i)).unlink();
for(int i=0, size=unary.size(); i<size; i++)
((Definition) unary.elementAt(i)).unlink();
for(int i=0, size=defuz.size(); i<size; i++)
((Definition) defuz.elementAt(i)).unlink();
for(int i=0, size=mfunc.size(); i<size; i++)
((Definition) mfunc.elementAt(i)).unlink();
for(int i=0, size=family.size(); i<size; i++)
((Definition) family.elementAt(i)).unlink();
for(int i=0, size=crisp.size(); i<size; i++)
((Definition) crisp.elementAt(i)).unlink();
File path = new File(System.getProperty("xfuzzy.path"));
File dir = new File(path,"pkg"+File.separator+this.name);
File binarydir = new File(dir,"binary");
File unarydir = new File(dir,"unary");
File crispdir = new File(dir,"crisp");
File defuzdir = new File(dir,"defuz");
File mfuncdir = new File(dir,"mfunc");
File familydir = new File(dir,"family");
binarydir.delete();
unarydir.delete();
crispdir.delete();
defuzdir.delete();
mfuncdir.delete();
familydir.delete();
dir.delete();
}
/**
* Elimina el paquete y todos los archivos creados al compilar
*/
public void delete() {
unlink();
file.delete();
}
/**
* Obtiene la descripci�n XFL3 del paquete
*/
public String toPkg() {
String code = "";
for(int i=0, size=binary.size(); i<size; i++)
code += ((Definition) binary.elementAt(i)).toPkg();
for(int i=0, size=unary.size(); i<size; i++)
code += ((Definition) unary.elementAt(i)).toPkg();
for(int i=0, size=defuz.size(); i<size; i++)
code += ((Definition) defuz.elementAt(i)).toPkg();
for(int i=0, size=mfunc.size(); i<size; i++)
code += ((Definition) mfunc.elementAt(i)).toPkg();
for(int i=0, size=family.size(); i<size; i++)
code += ((Definition) family.elementAt(i)).toPkg();
for(int i=0, size=crisp.size(); i<size; i++)
code += ((Definition) crisp.elementAt(i)).toPkg();
return code;
}
/**
* Almacena la descripci�n en el fichero del paquete
*/
public boolean save() {
if(this.file == null) return false;
String code = toPkg();
byte buf[] = code.getBytes();
try {
OutputStream stream = new FileOutputStream(this.file);
stream.write(buf);
stream.close();
}
catch (IOException e) { return false; }
return true;
}
/**
* Almacena la descripci�n del paquete en un fichero dado
*/
public boolean save_as(File file) {
String filename = file.getName();
this.file = file;
if(!save()) return false;
rename(filename.substring(0, filename.indexOf(".")));
compile();
return true;
}
/**
* Asigna el valor al car�cter de modificado del paquete
*/
public void setModified(boolean b) {
this.modified = b;
}
/**
* Verifica si el paquete contiene cambios sin almacenar
*/
public boolean isModified() {
return this.modified;
}
/**
* Asigna la referencia del editor del paquete
*/
public void setEditor(Object editor) {
this.editor = editor;
}
/**
* Obtiene la referencia al editor del paquete
*/
public Object getEditor() {
return this.editor;
}
/**
* Verifica si alguna definici�n est� siendo editada
*/
public boolean isEditingDefinitions() {
boolean editing = false;
for(int i=0;i<binary.size(); i++)
if( ((Definition) binary.elementAt(i)).isEditing() ) editing = true;
for(int i=0;i<unary.size(); i++)
if( ((Definition) unary.elementAt(i)).isEditing() ) editing = true;
for(int i=0;i<mfunc.size(); i++)
if( ((Definition) mfunc.elementAt(i)).isEditing() ) editing = true;
for(int i=0;i<defuz.size(); i++)
if( ((Definition) defuz.elementAt(i)).isEditing() ) editing = true;
for(int i=0;i<family.size(); i++)
if( ((Definition) family.elementAt(i)).isEditing() ) editing = true;
for(int i=0;i<crisp.size(); i++)
if( ((Definition) crisp.elementAt(i)).isEditing() ) editing = true;
return editing;
}
/**
* Verifica si el paquete est� siendo editado
*/
public boolean isEditing() {
return (this.editor != null);
}
/**
* Verifica si el paquete es editable
*/
public boolean isEditable() {
return !this.name.equals("xfl");
}
/**
* Obtiene el fichero de almacenamiento del paquete
*/
public File getFile() {
return this.file;
}
/**
* Modifica el nombre del paquete
*/
public void rename(String name) {
this.name = name;
for(int i=0; i<binary.size(); i++)
((Definition) binary.elementAt(i)).setPackageName(name);
for(int i=0; i<unary.size(); i++)
((Definition) unary.elementAt(i)).setPackageName(name);
for(int i=0; i<defuz.size(); i++)
((Definition) defuz.elementAt(i)).setPackageName(name);
for(int i=0; i<mfunc.size(); i++)
((Definition) mfunc.elementAt(i)).setPackageName(name);
for(int i=0; i<family.size(); i++)
((Definition) family.elementAt(i)).setPackageName(name);
for(int i=0; i<crisp.size(); i++)
((Definition) crisp.elementAt(i)).setPackageName(name);
}
}