aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/example/ImageViewer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/example/ImageViewer.java')
-rw-r--r--src/interfaces/jdbc/example/ImageViewer.java377
1 files changed, 377 insertions, 0 deletions
diff --git a/src/interfaces/jdbc/example/ImageViewer.java b/src/interfaces/jdbc/example/ImageViewer.java
new file mode 100644
index 00000000000..9e93d83c7c3
--- /dev/null
+++ b/src/interfaces/jdbc/example/ImageViewer.java
@@ -0,0 +1,377 @@
+package example;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.io.*;
+import java.sql.*;
+import postgresql.largeobject.*;
+
+/**
+ * This example is a small application that stores and displays images
+ * held on a postgresql database.
+ *
+ * Before running this application, you need to create a database, and
+ * on the first time you run it, select "Initialise" in the "PostgreSQL"
+ * menu.
+ *
+ * Important note: You will notice we import the postgresql.largeobject
+ * package, but don't import the postgresql package. The reason for this is
+ * that importing postgresql can confuse javac (we have conflicting class names
+ * in postgresql.* and java.sql.*). This doesn't cause any problems, as long
+ * as no code imports postgresql.
+ *
+ * Under normal circumstances, code using any jdbc driver only needs to import
+ * java.sql, so this isn't a problem.
+ *
+ * It's only if you use the non jdbc facilities, do you have to take this into
+ * account.
+ *
+ */
+
+public class ImageViewer implements ItemListener
+{
+ Connection db;
+ Statement stat;
+ LargeObjectManager lom;
+ Frame frame;
+ Label label; // Label used to display the current name
+ List list; // The list of available images
+ imageCanvas canvas; // Canvas used to display the image
+ String currentImage; // The current images name
+
+ // This is a simple component to display our image
+ public class imageCanvas extends Canvas
+ {
+ private Image image;
+
+ public imageCanvas()
+ {
+ image=null;
+ }
+
+ public void setImage(Image img)
+ {
+ image=img;
+ repaint();
+ }
+
+ // This defines our minimum size
+ public Dimension getMinimumSize()
+ {
+ return new Dimension(400,400);
+ }
+
+ public Dimension getPreferedSize()
+ {
+ return getMinimumSize();
+ }
+
+ public void update(Graphics g)
+ {
+ paint(g);
+ }
+
+ public void paint(Graphics g)
+ {
+ g.setColor(Color.gray);
+ g.fillRect(0,0,getSize().width,getSize().height);
+
+ if(image!=null)
+ g.drawImage(image,0,0,this);
+ }
+ }
+
+ public ImageViewer(Frame f,String url,String user,String password) throws ClassNotFoundException, FileNotFoundException, IOException, SQLException
+ {
+ frame = f;
+
+ MenuBar mb = new MenuBar();
+ Menu m;
+ MenuItem i;
+
+ f.setMenuBar(mb);
+ mb.add(m = new Menu("PostgreSQL"));
+ m.add(i= new MenuItem("Initialise"));
+ i.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ ImageViewer.this.init();
+ }
+ });
+
+ m.add(i= new MenuItem("Exit"));
+ ActionListener exitListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ ImageViewer.this.close();
+ }
+ };
+ m.addActionListener(exitListener);
+
+ mb.add(m = new Menu("Image"));
+ m.add(i= new MenuItem("Import"));
+ ActionListener importListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ ImageViewer.this.importImage();
+ }
+ };
+ i.addActionListener(importListener);
+
+ m.add(i= new MenuItem("Remove"));
+ ActionListener removeListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ ImageViewer.this.removeImage();
+ }
+ };
+ i.addActionListener(removeListener);
+
+ // To the north is a label used to display the current images name
+ f.add("North",label = new Label());
+
+ // We have a panel to the south of the frame containing the controls
+ Panel p = new Panel();
+ p.setLayout(new FlowLayout());
+ Button b;
+ p.add(b=new Button("Refresh List"));
+ b.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ ImageViewer.this.refreshList();
+ }
+ });
+ p.add(b=new Button("Import new image"));
+ b.addActionListener(importListener);
+ p.add(b=new Button("Remove image"));
+ b.addActionListener(removeListener);
+ p.add(b=new Button("Quit"));
+ b.addActionListener(exitListener);
+ f.add("South",p);
+
+ // And a panel to the west containing the list of available images
+ f.add("West",list=new List());
+ list.addItemListener(this);
+
+ // Finally the centre contains our image
+ f.add("Center",canvas = new imageCanvas());
+
+ // Load the driver
+ Class.forName("postgresql.Driver");
+
+ // Connect to database
+ System.out.println("Connecting to Database URL = " + url);
+ db = DriverManager.getConnection(url, user, password);
+
+ // Create a statement
+ stat = db.createStatement();
+
+ // Also, get the LargeObjectManager for this connection
+ lom = ((postgresql.Connection)db).getLargeObjectAPI();
+
+ // Now refresh the image selection list
+ refreshList();
+ }
+
+
+ /**
+ * This method initialises the database by creating a table that contains
+ * the image names, and Large Object OID's
+ */
+ public void init()
+ {
+ try {
+ stat.executeUpdate("create table images (imgname name,imgoid oid)");
+ label.setText("Initialised database");
+ } catch(SQLException ex) {
+ label.setText(ex.toString());
+ }
+ }
+
+ /**
+ * This closes the connection, and ends the application
+ */
+ public void close()
+ {
+ try {
+ db.close();
+ } catch(SQLException ex) {
+ System.err.println(ex.toString());
+ }
+ System.exit(0);
+ }
+
+ /**
+ * This imports an image into the database.
+ *
+ * This is the most efficient method, using the large object extension.
+ */
+ public void importImage()
+ {
+ FileDialog d = new FileDialog(frame,"Import Image",FileDialog.LOAD);
+ d.setVisible(true);
+ String name = d.getFile();
+ String dir = d.getDirectory();
+ d.dispose();
+
+ // Now the real import stuff
+ if(name!=null && dir!=null) {
+ try {
+ System.out.println("Importing file");
+ // A temporary buffer - this can be as large as you like
+ byte buf[] = new byte[2048];
+
+ // Open the file
+ System.out.println("Opening file "+dir+"/"+name);
+ FileInputStream fis = new FileInputStream(new File(dir,name));
+
+ // Gain access to large objects
+ System.out.println("Gaining LOAPI");
+
+ // Now create the large object
+ System.out.println("creating blob");
+ int oid = lom.create();
+
+ System.out.println("Opening "+oid);
+ LargeObject blob = lom.open(oid);
+
+ // Now copy the file into the object.
+ //
+ // Note: we dont use write(buf), as the last block is rarely the same
+ // size as our buffer, so we have to use the amount read.
+ System.out.println("Importing file");
+ int s,t=0;
+ while((s=fis.read(buf,0,buf.length))>0) {
+ System.out.println("Block s="+s+" t="+t);t+=s;
+ blob.write(buf,0,s);
+ }
+
+ // Close the object
+ System.out.println("Closing blob");
+ blob.close();
+
+ // Now store the entry into the table
+ stat.executeUpdate("insert into images values ('"+name+"',"+oid+")");
+ stat.close();
+
+ // Finally refresh the names list, and display the current image
+ refreshList();
+ displayImage(name);
+ } catch(Exception ex) {
+ label.setText(ex.toString());
+ }
+ }
+ }
+
+ /**
+ * This refreshes the list of available images
+ */
+ public void refreshList()
+ {
+ try {
+ // First, we'll run a query, retrieving all of the image names
+ ResultSet rs = stat.executeQuery("select imgname from images order by imgname");
+ if(rs!=null) {
+ list.removeAll();
+ while(rs.next())
+ list.addItem(rs.getString(1));
+ rs.close();
+ }
+ } catch(SQLException ex) {
+ label.setText(ex.toString()+" Have you initialised the database?");
+ }
+ }
+
+ /**
+ * This removes an image from the database
+ *
+ * Note: With postgresql, this is the only way of deleting a large object
+ * using Java.
+ */
+ public void removeImage()
+ {
+ try {
+ // Delete any large objects for the current name
+ ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+currentImage+"'");
+ if(rs!=null) {
+ // Even though there should only be one image, we still have to
+ // cycle through the ResultSet
+ while(rs.next()) {
+ System.out.println("Got oid "+rs.getInt(1));
+ lom.delete(rs.getInt(1));
+ System.out.println("Import complete");
+ }
+ }
+ rs.close();
+
+ // Finally delete any entries for that name
+ stat.executeUpdate("delete from images where imgname='"+currentImage+"'");
+
+ label.setText(currentImage+" deleted");
+ currentImage=null;
+ refreshList();
+ } catch(SQLException ex) {
+ label.setText(ex.toString());
+ }
+ }
+
+ /**
+ * This displays an image from the database.
+ *
+ * For images, this is the easiest method.
+ */
+ public void displayImage(String name)
+ {
+ try {
+ System.out.println("Selecting oid for "+name);
+ ResultSet rs = stat.executeQuery("select imgoid from images where imgname='"+name+"'");
+ if(rs!=null) {
+ // Even though there should only be one image, we still have to
+ // cycle through the ResultSet
+ while(rs.next()) {
+ System.out.println("Got oid "+rs.getInt(1));
+ canvas.setImage(canvas.getToolkit().createImage(rs.getBytes(1)));
+ System.out.println("Import complete");
+ label.setText(currentImage = name);
+ }
+ }
+ rs.close();
+ } catch(SQLException ex) {
+ label.setText(ex.toString());
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ displayImage(list.getItem(((Integer)e.getItem()).intValue()));
+ }
+
+ /**
+ * This is the command line instructions
+ */
+ public static void instructions()
+ {
+ System.err.println("java example.ImageViewer jdbc-url user password");
+ System.err.println("\nExamples:\n");
+ System.err.println("java -Djdbc.driver=postgresql.Driver example.ImageViewer jdbc:postgresql:test postgres password\n");
+
+ System.err.println("This example tests the binary large object api of the driver.\nBasically, it will allow you to store and view images held in the database.");
+ System.err.println("Note: If you are running this for the first time on a particular database,\nyou have to select \"Initialise\" in the \"PostgreSQL\" menu.\nThis will create a table used to store image names.");
+ }
+
+ /**
+ * This is the application entry point
+ */
+ public static void main(String args[])
+ {
+ if(args.length!=3) {
+ instructions();
+ System.exit(1);
+ }
+
+ try {
+ Frame frame = new Frame("PostgreSQL ImageViewer v6.3 rev 1");
+ frame.setLayout(new BorderLayout());
+ ImageViewer viewer = new ImageViewer(frame,args[0],args[1],args[2]);
+ frame.pack();
+ frame.setVisible(true);
+ } catch(Exception ex) {
+ System.err.println("Exception caught.\n"+ex);
+ ex.printStackTrace();
+ }
+ }
+}