summaryrefslogtreecommitdiff
path: root/jpl/JPL_Rolo
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>1998-11-30 01:30:44 +0000
committerGurusamy Sarathy <gsar@cpan.org>1998-11-30 01:30:44 +0000
commit93e0cdbd0f68fd8d8d75c3510f7893c1ebaa26ae (patch)
treea6c84af1c502bc73fa1730324995f4e1fcb207b3 /jpl/JPL_Rolo
parenta8710ca18eb34a984d0dfab8503448f77a53b379 (diff)
parent57dea26d80db9a1b455ef89cc843930fe18b0369 (diff)
downloadperl-93e0cdbd0f68fd8d8d75c3510f7893c1ebaa26ae.tar.gz
branch jpl from perlext to perl
p4raw-id: //depot/perl@2410
Diffstat (limited to 'jpl/JPL_Rolo')
-rwxr-xr-xjpl/JPL_Rolo/JPL_Rolo.jpl553
-rw-r--r--jpl/JPL_Rolo/Makefile.PL84
-rw-r--r--jpl/JPL_Rolo/README27
-rwxr-xr-xjpl/JPL_Rolo/cardfile7
4 files changed, 671 insertions, 0 deletions
diff --git a/jpl/JPL_Rolo/JPL_Rolo.jpl b/jpl/JPL_Rolo/JPL_Rolo.jpl
new file mode 100755
index 0000000000..3c77fb2690
--- /dev/null
+++ b/jpl/JPL_Rolo/JPL_Rolo.jpl
@@ -0,0 +1,553 @@
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+
+public class JPL_Rolo extends Frame {
+
+ // The primary key of the row that is current onscreen.
+ //
+ int current_row = 0;
+
+ // TextField objects for each column.
+ //
+ TextField fld_name, fld_address, fld_city, fld_state, fld_zip, fld_id;
+
+ // Add or Edit mode.
+ //
+ String edit_status;
+
+ // a layout manager for the Frame
+ //
+ GridBagLayout gb = new GridBagLayout();
+
+ // Action buttons.
+ //
+ Button next, previous, quit, save, newrow, edit, cancel, delete;
+
+ // A Panel for the action buttons.
+ //
+ Panel actionbuttons;
+
+ /**
+ * Construct a new instance of JPL_Rolo.
+ */
+ public JPL_Rolo(String[] argv) {
+ CreateForm();
+ addWindowListener(new WinEventHandler() );
+ }
+
+ public void CreateForm() {
+
+ // set the layout for the frame
+ //
+ this.setLayout(gb);
+
+ // this is the offset within the GridBagLayout. If
+ // I want the next object on a different line, I
+ // postincrement. If not, I don't.
+ //
+ int i = 0;
+
+ // Add a text field for the name.
+ //
+ AddToFrame(new Label("Name:"), 0, i);
+ fld_name = new TextField(20);
+ fld_name.setEditable(false);
+ AddToFrame(fld_name, 1, i++);
+
+ // The address.
+ //
+ AddToFrame(new Label("Address:"), 0, i);
+ fld_address = new TextField(35);
+ fld_address.setEditable(false);
+ AddToFrame(fld_address, 1, i++);
+
+ // The City. I'm not going to increment i, so the
+ // next field will show up on the same line.
+ //
+ AddToFrame(new Label("City:"), 0, i);
+ fld_city = new TextField(20);
+ fld_city.setEditable(false);
+ AddToFrame(fld_city, 1, i);
+
+ // The State.
+ //
+ AddToFrame(new Label("State:"), 2, i);
+ fld_state = new TextField(2);
+ fld_state.setEditable(false);
+ AddToFrame(fld_state, 3, i++);
+
+ // The Zip Code.
+ //
+ AddToFrame(new Label("Zip:"), 0, i);
+ fld_zip = new TextField(11);
+ fld_zip.setEditable(false);
+ AddToFrame(fld_zip, 1, i++);
+
+ // The id - this is always read-only.
+ //
+ AddToFrame(new Label("Id:"), 0, i);
+ fld_id = new TextField(4);
+ fld_id.setEditable(false);
+ AddToFrame(fld_id, 1, i++);
+
+ // create the button panel and give it a FlowLayout
+ //
+ actionbuttons = new Panel();
+ actionbuttons.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
+
+ // Add the button panel to the Frame. The AddToFrame
+ // method isn't really set up to handle this sort of
+ // panel, so we will go through the tedious process
+ // of managing the GridBagConstraints...
+ //
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridwidth = 3; c.gridheight = 1;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.CENTER;
+ c.weightx = 0.0; c.weighty = 0.0;
+ c.gridx = 0; c.gridy = i;
+ ((GridBagLayout)this.getLayout()).setConstraints(actionbuttons, c);
+ this.add(actionbuttons);
+
+ // instantiate and add each of the buttons
+ //
+ previous = new Button("Previous");
+ actionbuttons.add(previous);
+ previous.addActionListener( new PrevRowHandler() );
+
+ next = new Button("Next");
+ actionbuttons.add(next);
+ next.addActionListener( new NextRowHandler() );
+
+ quit = new Button("Quit");
+ actionbuttons.add(quit);
+ quit.addActionListener( new QuitHandler() );
+
+ newrow = new Button("New");
+ actionbuttons.add(newrow);
+ newrow.addActionListener( new NewRowHandler() );
+
+ edit = new Button("Edit");
+ actionbuttons.add(edit);
+ edit.addActionListener( new EditRowHandler() );
+
+ delete = new Button("Delete");
+ actionbuttons.add(delete);
+ delete.addActionListener( new DeleteRowHandler() );
+
+ // save and cancel are disabled until the user
+ // is adding or editing.
+ //
+ save = new Button("Save");
+ actionbuttons.add(save);
+ save.setEnabled(false);
+ save.addActionListener( new SaveHandler() );
+
+ cancel = new Button("Cancel");
+ actionbuttons.add(cancel);
+ cancel.setEnabled(false);
+ cancel.addActionListener( new CancelHandler() );
+
+ // Invoke getRow() to display the first row in the table.
+ //
+ getRow(0);
+
+ }
+
+ /**
+ * Return the id of the current row.
+ */
+ public int getCurrentRowVal() {
+ return current_row;
+ }
+
+ public void setCols(String name, String address, String city, String state, String zip, String id) {
+
+ clearForm();
+
+ fld_name.setText(name);
+ fld_address.setText(address);
+ fld_city.setText(city);
+ fld_state.setText(state);
+ fld_zip.setText(zip);
+ fld_id.setText(id);
+ current_row = Integer.parseInt(id);
+
+ }
+
+
+ public void setCurrentRow(int r) {
+ current_row = r;
+ }
+
+ public String getName() { return fld_name.getText(); }
+ public String getAddress() { return fld_address.getText(); }
+ public String getCity() { return fld_city.getText(); }
+ public String getState() { return fld_state.getText(); }
+ public String getZip() { return fld_zip.getText(); }
+ public String getId() { return fld_id.getText(); }
+
+ /**
+ * This eventhandler will move to the previous row.
+ */
+ class PrevRowHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ getRow(-1);
+ }
+ }
+
+ /**
+ * This eventhandler will move to the next row.
+ */
+ class NextRowHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ getRow(1);
+ }
+ }
+
+ /**
+ * This eventhandler will terminate the application.
+ */
+ class QuitHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ System.exit(0);
+ }
+ }
+
+ /**
+ * This eventhandler will display a blank record and put
+ * this application in new record mode.
+ */
+ class NewRowHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ clearForm();
+ edit_status = "new";
+ setEdit();
+ }
+ }
+
+ /**
+ * This eventhandler will put the application in edit
+ * mode (for the current row).
+ */
+ class EditRowHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ edit_status = "edit";
+ setEdit();
+ }
+ }
+ /**
+ * This eventhandler will delete the current row.
+ */
+ class DeleteRowHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ delRow();
+ }
+ }
+
+ /**
+ * This eventhandler will save (update or insert) the
+ * current record.
+ */
+ class SaveHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+
+ if (edit_status.equals("new")) {
+ saveIt();
+ }
+ if (edit_status.equals("edit")) {
+ updateRow();
+ }
+
+ // set the edit_status to "browse", and call setBrowse()
+ //
+ edit_status = "browse";
+ setBrowse();
+ }
+ }
+
+ /**
+ * This eventhandler cancels any pending edit.
+ */
+ class CancelHandler implements ActionListener {
+ public void actionPerformed( ActionEvent e) {
+ // if it was new, make sure that they can't edit the
+ // id field...
+
+ if (edit_status.equals("new")) {
+ fld_id.setEditable(false);
+ }
+
+ // return the edit_status to browse, call getRow()
+ // to retrieve the row they were looking at
+ // before editing or adding, and call setBrowse()
+ //
+ edit_status = "browse";
+ getRow(0);
+ setBrowse();
+ }
+ }
+
+ // This is the event handler to deal with cases where
+ // the user closes the window with a window control.
+ //
+ class WinEventHandler extends WindowAdapter {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ }
+
+ /**
+ * clearForm()
+ */
+ protected void clearForm () {
+ fld_name.setText("");
+ fld_address.setText("");
+ fld_city.setText("");
+ fld_state.setText("");
+ fld_zip.setText("");
+ fld_id.setText("");
+ }
+
+ /**
+ * AddToFrame()
+ * A convenience method to wrap the living hell
+ * that is GridBagConstraints()
+ */
+ protected void AddToFrame (Component item, int x, int y) {
+
+ // some sane layout defaults.
+ //
+ GridBagConstraints c = new GridBagConstraints();
+ c.gridwidth = 1; c.gridheight = 1;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.weightx = 0.0; c.weighty = 0.0;
+
+ // set the grid coordinates
+ //
+ c.gridx = x; c.gridy = y;
+
+ // set the constraints, and add the item to the layout
+ //
+
+ ((GridBagLayout)this.getLayout()).setConstraints(item, c);
+ this.add(item);
+ }
+
+ /**
+ * setEdit()
+ *
+ * prepare the form for editing/adding
+ */
+ protected void setEdit () {
+
+ // disable all these buttons
+ //
+ next.setEnabled(false);
+ previous.setEnabled(false);
+ newrow.setEnabled(false);
+ edit.setEnabled(false);
+ delete.setEnabled(false);
+
+ // set everything except the id to be editable
+ //
+ fld_name.setEditable(true);
+ fld_address.setEditable(true);
+ fld_city.setEditable(true);
+ fld_state.setEditable(true);
+ fld_zip.setEditable(true);
+
+ // enable these two buttons
+ //
+ save.setEnabled(true);
+ cancel.setEnabled(true);
+ }
+
+ /**
+ * setBrowse()
+ *
+ * prepare the form for viewing
+ *
+ */
+ protected void setBrowse() {
+
+ // enable all these buttons
+ //
+ next.setEnabled(true);
+ previous.setEnabled(true);
+ newrow.setEnabled(true);
+ edit.setEnabled(true);
+ delete.setEnabled(true);
+
+ // disable the fields
+ //
+ fld_name.setEditable(false);
+ fld_address.setEditable(false);
+ fld_city.setEditable(false);
+ fld_state.setEditable(false);
+ fld_zip.setEditable(false);
+ fld_id.setEditable(false);
+
+ // disable these two buttons
+ //
+ save.setEnabled(false);
+ cancel.setEnabled(false);
+ }
+
+ perl void delRow() {{
+
+ my $id = $self->getId____s();
+
+ $sql = qq[delete from cardfile ] .
+ qq[where (id = $id)];
+
+ use Sprite;
+ my $rdb = new Sprite();
+ my @data = $rdb->sql($sql);
+ $rdb->close("cardfile");
+ my $status = shift @data;
+ if (!$status) {
+ print STDERR "Bummer - couldn't execute query!\n";
+ die;
+ }
+ $self->setCurrentRow__I(0);
+ $self->getRow__I(0);
+
+ }}
+
+ perl void updateRow() {{
+
+ my $name = $self->getName____s();
+ my $address = $self->getAddress____s();
+ my $city = $self->getCity____s();
+ my $state = $self->getState____s();
+ my $zip = $self->getZip____s();
+ my $id = $self->getId____s();
+
+ $sql = qq[update cardfile ] .
+ qq[set name = ('$name'), ] .
+ qq[set address = ('$address'), ] .
+ qq[set city = ('$city'), ] .
+ qq[set state = ('$state'), ] .
+ qq[set zip = ('$zip') ] .
+ qq[where (id = $id)];
+
+ use Sprite;
+ my $rdb = new Sprite();
+ my @data = $rdb->sql($sql);
+ $rdb->close("cardfile");
+ my $status = shift @data;
+ if (!$status) {
+ print STDERR "Bummer - couldn't execute query!\n";
+ die;
+ }
+
+ }}
+
+
+ /**
+ * getRow()
+ *
+ * This method is used to either fetch this current row,
+ * in which case it is given an argument of zero, or it
+ * can be used to move relative to the current row, in
+ * which case it must be given an argument of 1 or -1.
+ *
+ */
+
+
+ perl void getRow(int direction) {{
+
+ use Sprite;
+ my $rdb = new Sprite();
+
+ my $nextid = $self->getCurrentRowVal____I() + $direction;
+ my $op;
+ if ($direction == -1) {
+ $op = "<=";
+ } else {
+ $op = ">=";
+ }
+ my @data = $rdb->sql("select name, address, city, state, zip, id from cardfile where id $op $nextid");
+ $rdb->close("cardfile");
+
+ my $status = shift @data;
+ if (!$status) {
+ print STDERR "Bummer - couldn't execute query!\n";
+ die;
+ }
+
+ my $numrows = scalar(@data);
+
+ if (!$numrows) {
+ print STDERR "End of file reached.\n";
+ return;
+ }
+
+ my $index;
+ if ($direction == -1) {
+ $index = $#data;
+ } else {
+ $index = 0;
+ }
+ my($name, $address, $city, $state, $zip, $id) = split (/\0/, $data[$index], 6);
+ $self->setCols__ssssss($name, $address, $city, $state, $zip, $id);
+
+ }}
+
+ perl void saveIt() {{
+
+ use Sprite;
+ my $rdb = new Sprite();
+
+ my @data = $rdb->sql("select id, name from cardfile");
+
+ my $status = shift @data;
+ if (!$status) {
+ print STDERR "Bummer - couldn't execute query!\n";
+ die;
+ }
+
+ my @ids;
+ foreach $record (@data) {
+ my ($id, $name) = split (/\0/, $record, 2);
+ push @ids, $id;
+ }
+ @ids = sort @ids;
+ my $newid = $ids[$#ids] + 1;
+
+ my $name = $self->getName____s();
+ my $address = $self->getAddress____s();
+ my $city = $self->getCity____s();
+ my $state = $self->getState____s();
+ my $zip = $self->getZip____s();
+
+ my $sql = "insert into cardfile (name, address, city, state, zip, id) values ('$name', '$address', '$city', '$state', '$zip', $newid)";
+ @data = $rdb->sql($sql);
+ $rdb->close("cardfile");
+
+ $status = shift @data;
+ if (!$status) {
+ print STDERR "Bummer - couldn't execute insert!\n";
+ die;
+ }
+
+ $self->setCurrentRow__I($newid);
+
+ }}
+
+ public static void main(String[] args) {
+
+ // make a new JPL_Rolo, pack() it and show() it.
+ JPL_Rolo cardfile = new JPL_Rolo(args);
+ cardfile.pack();
+ cardfile.show();
+
+ }
+
+}
+
+
diff --git a/jpl/JPL_Rolo/Makefile.PL b/jpl/JPL_Rolo/Makefile.PL
new file mode 100644
index 0000000000..3dd1f84411
--- /dev/null
+++ b/jpl/JPL_Rolo/Makefile.PL
@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+
+$JPL_HOME = $ENV{JPL_HOME}
+ or die "You have not run setvars to set your environment variables.\n" .
+ "See the JPL README file for more information.\n";
+
+use Config;
+
+eval `$JPL_HOME/setvars -perl`;
+
+chop($WHAT = `pwd`);
+$WHAT =~ s#.*/##;
+
+if ($^O eq 'linux') {
+ $flags = "-Dbool=char"; # avoid builtin bool altogether
+ $libs = "-lc -lm -ldl";
+}
+else {
+ $flags = "";
+ $libs = "-lc -lm -ldl";
+}
+chop($cwd = `pwd`);
+($jpldir = $cwd) =~ s#/[^/]*$##;
+
+open(MAKEFILE, ">Makefile");
+
+print MAKEFILE <<"SUBS";
+CC = $Config{cc}
+WHAT = $WHAT
+PERL = perl$]
+ARCHNAME = $Config{archname}
+JAVA_HOME = $ENV{JAVA_HOME}
+JPL_HOME = $ENV{JPL_HOME}
+PERLARCHDIR = $Config{archlib}
+FLAGS = $Config{cccdlflags} $Config{ccdlflags} $Config{lddlflags} $flags
+INCL = -I\$(PERLARCHDIR)/CORE \\
+ -I\$(JAVA_HOME)/include \\
+ -I\$(JAVA_HOME)/include/$^O \\
+ -I\$(JAVA_HOME)/include/genunix
+LIBS = $libs
+
+SUBS
+
+print MAKEFILE <<'NOSUBS';
+.SUFFIXES: .jpl .class
+
+.jpl.class:
+ $(PERL) -MJPL::Compile -e "file('$*.jpl')"
+
+all: $(WHAT).class lib$(WHAT).so
+
+debug: $(WHAT)_g.class lib$(WHAT)_g.so
+
+lib$(WHAT).so: $(WHAT).c $(JPL_HOME)/lib/$(ARCHNAME)/libPerlInterpreter.so
+ $(CC) $(FLAGS) $(INCL) $(WHAT).c \
+ $(PERLARCHDIR)/CORE/libperl.so \
+ $(JPL_HOME)/lib/$(ARCHNAME)/libPerlInterpreter.so \
+ $(LIBS) \
+ -o lib$(WHAT).so
+
+lib$(WHAT)_g.so: $(WHAT).c $(JPL_HOME)/lib/$(ARCHNAME)/libPerlInterpreter_g.so
+ $(CC) -g $(FLAGS) $(INCL) $(WHAT).c \
+ $(PERLARCHDIR)/CORE/libperl.so \
+ $(JPL_HOME)/lib/$(ARCHNAME)/libPerlInterpreter_g.so \
+ $(LIBS) \
+ -o lib$(WHAT)_g.so
+
+test:
+
+install: all
+ cp $(WHAT).class $(JPL_HOME)/lib
+ cp lib$(WHAT).so $(JPL_HOME)/lib/$(ARCHNAME)
+ cp $(WHAT).pl $(JPL_HOME)/perl
+
+clean:
+ rm -f $(WHAT).c $(WHAT).h \
+ $(WHAT)*.class $(WHAT)*.pl lib$(WHAT).so $(WHAT)*.java
+
+distclean: clean
+ rm -f Makefile
+
+NOSUBS
+
+close MAKEFILE;
diff --git a/jpl/JPL_Rolo/README b/jpl/JPL_Rolo/README
new file mode 100644
index 0000000000..6d4b14b3fe
--- /dev/null
+++ b/jpl/JPL_Rolo/README
@@ -0,0 +1,27 @@
+Welcome to the Sprite sample application for Larry Wall's JPL. This
+application showcases a merging of Java and Perl in which Java is employed
+to generate a user interface, and Perl is used for data access.
+Specifically, Perl is used with Shishir Gundavaram's Sprite module to offer
+permanent storage through SQL manipulation of text files. This application
+is a Rolodex(tm)-style address file, offering the ability to add, edit or
+delete names and addresses. You may also navigate through the address list.
+
+To use this example, you will need to install the Sprite module from CPAN.
+
+To install the sample, you must first have JPL installed and working.
+Please ensure that you have set environment variables as directed in the
+JPL README and that the JPL Sample program works. Once this has been
+accomplished, you can build the files in this directory with the following
+commmands:
+
+ perl Makefile.PL
+ make
+ make install
+
+You can run this by typing:
+
+ java JPL_Rolo
+
+The application should appear with some sample data, and you can mess
+around with it and put all your friends in the address book. Far out!
+
diff --git a/jpl/JPL_Rolo/cardfile b/jpl/JPL_Rolo/cardfile
new file mode 100755
index 0000000000..eecc8067ba
--- /dev/null
+++ b/jpl/JPL_Rolo/cardfile
@@ -0,0 +1,7 @@
+name,address,city,state,zip,id
+Brian Jepson,50 Hudson Street,Providence,RI,02909,100
+Elvis Presley,50 Hudson Street,Providence,RI,02909,101
+AS220,115 Empire Street,Providence,RI,02909,600
+Mr. Jones,100 Loudermilk Drive,Springfield,??,,602
+George Maciunas,Canal Street,New York,NY,????,603
+Emmett Williams,Broome Street,New York,NY,?????,605