Java/Development Class/Perl

Материал из Java эксперт
Перейти к: навигация, поиск

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;
  }
}