Java/Development Class/Perl
Java Class that calls a Perl function
<source lang="java">
/***************************************************************
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.
*
* 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; }
}
</source>