Povezivanje JAVA programa i FSIT-a

U FSIT program ugrađena je naredba ExternalJavaCall kojom se omogućuje pozivanje eksternog JAVA programa iz FSIT-a. Sintaksa naredbe je:

ExternalJavaCall ime_klase;

'ime_klase' određuje klasu koju će FSIT pokušati učitati i pokrenuti. Ova klasa mora implementirati sučelje ' hr.fer.zemris.fsit.ExternalJavaCallClassI' koje je opisano u nastavku. Ovo sučelje određuje postojanje metode Call koju će FSIT pozvati kako bi klasi dopustio izvođenje. Međutim, važno je naglasiti da FSIT neće nastaviti sa tumačenjem programa tako dugo dok se ne vrati iz Call metode. Zbog toga se preporuča da se u Call metodi jednostavno pokrene nova niti i sav posao obavlja u njoj, a odmah nakon pokretanja niti potrebno je izvršiti povratak iz metode Call.

Sučelje hr.fer.zemris.fsit.ExternalJavaCallClassI

package hr.fer.zemris.fsit;

public interface ExternalJavaCallClassI {
public void Call(FSITI fsit);
}

Sučelje hr.fer.zemris.dfsit.FSITI

package hr.fer.zemris.dfsit;

public interface FSITI {
public FSITUnaryFunctionI getUnaryFunctionByName(String name) throws FSITCommError;
public FSITPerceptronI getPerceptronByName(String name) throws FSITCommError;
public FSITMultiLayerPerceptronI getMultiLayerPerceptronByName(String name) throws FSITCommError;
public FSITFuzzyControlSystemI getFuzzyControlSystemByName(String name) throws FSITCommError;
}


Sučelje hr.fer.zemris.dfsit.FSITFuzzyControlSystemI

package hr.fer.zemris.dfsit;

public interface FSITFuzzyControlSystemI {
public double getVarValue(String varName) throws FSITCommError;
public void setVarValue(String varName, double d) throws FSITCommError;
public double getResultFor( String varName ) throws FSITCommError;
}

Sučelje hr.fer.zemris.dfsit.FSITMultiLayerPerceptronI

package hr.fer.zemris.dfsit;

public interface FSITMultiLayerPerceptronI {
public double[] getResponseFor(double [] inputs) throws FSITCommError;
}

Sučelje hr.fer.zemris.dfsit.FSITPerceptronI

package hr.fer.zemris.dfsit;

public interface FSITPerceptronI {
public double getResponseFor(double [] inputs) throws FSITCommError;
}

Sučelje hr.fer.zemris.dfsit.FSITUnaryFunctionI

package hr.fer.zemris.dfsit;

public interface FSITUnaryFunctionI {
public double getValueAt(double x) throws FSITCommError;
}

Jednostavan primjer

Neka je kao dio FSIT programa definiran FuzzyControlSystem pod nazivom 'sys1', kao u nastavku:

FuzzyControlSystem sys1 (
 DefineVars( udalj, brzina, smjer ),
 DefineVars( gas, okreni ),
 Rules(
     ...
 ),
 1
);
ExternalJavaCall ProbaA;


Ovo će rezultirati pozivanjem klase ProbaA. Ova klasa može se definirati na slijedeći način:

import hr.fer.zemris.fsit.*;
import hr.fer.zemris.dfsit.*;
import java.awt.*;
 
public class ProbaA implements ExternalJavaCallClassI {
  public void Call(FSITI fsit) {
   System.out.println("ProbaA pozvana!");
   ProbaAFrame fr = new ProbaAFrame(fsit);
   fr.start();
  }
}

class ProbaAFrame extends Frame implements Runnable {
  FSITFuzzyControlSystemI fs = null;  // Svi neizraziti sustavi

  // konstruktor
  public ProbaAFrame(FSITI fsit) {

   try {
    fs = fsit.getFuzzyControlSystemByName("sys1"); // izdvoji sustav 'sys1'
   } catch( FSITCommError e ) { ... }
  }

  public void run() {
   double Udalj, Brzina, Smjer, Gas, Okreni;

   // postavi Udalj, Brzina i Smjer na početne vrijednosti
   // ...
   // zatim...

   try {
    // 1) ubaci u sustav trenutne vrijednosti udalj, brzina i smjer
    fs.setVarValue("udalj", Udalj);
    fs.setVarValue("brzina", Brzina);
    fs.setVarValue("smjer", Smjer);

    // 2) Pitaj sustav koliki mora biti novi gas?
    Gas = fs.getResultFor( "gas" );

    // 3) Pitaj sustav treba li se okrenuti?
    Okreni = fs.getResultFor( "okreni" );
   } catch( FSITCommError e ) { ... }

   // sada napravi nesto sa tim rezultatima ...

  }

}

Ukoliko se gornji program smjesti u datoteku ProbaA.java, te u isti direktorij stavi i fsit.jar datoteka, potrebno je izvršiti kompajliranje:

javac -classpath fsit.jar ProbaA.java

Pokretanje programa se može izvesti naredbom:

appletviewer FSITLocal.html

uz pretpostavku da se u istom direktoriju nalazi datoteka FSITLocal.html čiji je sadržaj:

<APPLET CODE="hr/fer/zemris/fsit/Prva.class" ARCHIVE="fsit.jar" WIDTH="600" HEIGHT="400">
</APPLET>

Napomena:
Ovakvo pozivanje appleta onemogućava predonosti koje donosi JAVA 2 (swing i sl.) međutim, može poslužiti ukoliko se ne koriste napredne naredbe. Za podršku JAVA 2 potrebno je u FSITLocal.html upisati slijedeći sadržaj (umjesto prethodnog!):

<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 600 HEIGHT = 400 
 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0">
  <param NAME = CODE VALUE = "hr/fer/zemris/fsit/Prva" >
  <param NAME = CODEBASE VALUE = "." >
  <param NAME = ARCHIVE VALUE = "fsit.jar" >
  <param NAME="type" VALUE="application/x-java-applet;version=1.3">
  <param NAME="scriptable" VALUE="false">
  <COMMENT>
    <embed type="application/x-java-applet;version=1.3"  CODE = "hr/fer/zemris/fsit/Prva"
     CODEBASE = "." ARCHIVE = "fsit.jar" WIDTH = 600 HEIGHT = 400  scriptable=false
     pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html">
     <noembed>
      </COMMENT>
     </noembed>
    </embed>
</object>


Sažetak

Prije izvođenja primjera korisnik se nalazi u direktoriju X. Sadržaj tog direktorija je:
X/fsit.jar

Korisnik ukuca primjer i time stvori nove datoteke; sadržaj direktorija X tada je:
X/fsit.jar
X/ProbaA.java
X/FSITLocal.html

Nakon prevođenja java datoteke, nastaju još neke datoteke tako da je sadržaj direktorija X:
X/fsit.jar
X/ProbaA.java
X/FSITLocal.html
X/ProbaA.class
X/ProbaAFrame.class

Napomena:
Sustav neizrazitog upravljanja u primjeru nije potpun (treba definirati pravila), a isto tako metoda Run() klase ProbaAFrame komentarima označava mjesta gdje još treba inicijalizirati varijable te nešto napraviti sa rezultatima! Primjer je samo ogledni kako bi olakšao izradu potpuno funkcionalnih aplikacija.