Java/Development Class/Perl
Java Class that calls a Perl function
/***************************************************************
Download the jar for org.perl.inline.java first
****************************************************************/
//Perl file: StringDistance.pl
/*
#! /usr/bin/perl
# Perl main program acting as a stub for callbacks from Java
use strict;
use warnings;
# all modules called from either Perl or from Java must go here:
use Text::Levenshtein qw();
use Inline "Java" => "STUDY", # glean interface from Java class file
"AUTOSTUDY" => 1, # glean more interfaces, too, just in case
"STUDY" => ["StringDistance"], # name of our main Java class
"CLASSPATH" => ".", # needed in order to find main Java class
;
my $sd = StringDistance->new(\@ARGV); # construct instance of main Java class
$sd->show(); # call routine to show it
$sd->StartCallbackLoop(); # prepare to listen for threaded callbacks
*/
/** Example of a Java Class that calls a Perl function.
* <br/>
* Does not run on its own -- for usage, see StringDistance.pl!
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import org.perl.inline.java.*;
// requires classpath to include this file; usually something like
// .;<perldir>/site/lib/Inline/Java/InlineJavaServer.jar
/** The test class. */
public class StringDistance extends InlineJavaPerlCaller {
JFrame frame; // visual container
JTextField tf[], dist; // text input fields, result output field
JButton go, exit; // action buttons
/* The constructor with possibly 2 initial strings */
public StringDistance(String[] strs) throws InlineJavaException {
frame = new JFrame("StringDistance");
Container p = frame.getContentPane();
p.setLayout(new GridLayout(0,2));
// The input fields, including labels:
tf = new JTextField[2];
for (int i=0; i<2; i++) {
p.add(new JLabel("String " + i + ":"));
tf[i] = new JTextField(20);
if ((strs != null) && (i < strs.length)) tf[i].setText(strs[i]);
p.add(tf[i]);
}
// The output field, including label:
p.add(new JLabel("Distance:"));
dist = new JTextField(5);
dist.setEditable(false);
p.add(dist);
// The main action button:
go = new JButton("Compute distance");
go.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dist.setText(Integer.toString(match(tf[0].getText(),
tf[1].getText())));
}
}
);
p.add(go);
// To finish off:
exit = new JButton("Exit");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
frame.dispose(); System.exit(0);
}
}
);
p.add(exit);
if ((strs != null) && (strs.length > 1))
dist.setText(Integer.toString(match(tf[0].getText(),
tf[1].getText())));
frame.pack();
}
// Alternative constructors:
public StringDistance(String s0, String s1)
throws InlineJavaException {
this(new String[] { s0, s1 });
}
public StringDistance(String s0) throws InlineJavaException {
this(new String[] { s0 });
}
public StringDistance() throws InlineJavaException {
this((String[])null);
}
/** This shows everything */
public void show() { frame.setVisible(true); }
/* Optionally for pre-filling the input fields. */
public void setText(int fieldno, String str) {
tf[fieldno].setText(str);
}
/** The central interface function to Perl. */
public int match(String s0, String s1) {
try {
String str = (String)CallPerl("Text::Levenshtein", "distance",
new Object [] {s0, s1});
return Integer.parseInt(str);
} catch (InlineJavaPerlException e) {
System.err.println("Inline Java Perl Exception: " + e);
} catch (InlineJavaException e) {
System.err.println("Inline Java Exception: " + e);
}
return 0;
}
}