Skip Headers

Oracle® interMedia User's Guide
10g Release 1 (10.1)

Part Number B10840-01
Go to Documentation Home
Home
Go to Book List
Book List
Go to Table of Contents
Contents
Go to Index
Index
Go to Master Index
Master Index
Go to Feedback page
Feedback

Go to previous page
Previous
Go to next page
Next
View PDF

4 IMExample Java Sample Application

This chapter describes the IMExample Java sample application. This chapter assumes you have already installed, compiled, and can run this sample application. See the readme.txt file for requirements and instructions on how to install, compile, and run this sample application. This chapter describes how Oracle interMedia Java Classes is used in creating this sample application.

4.1 Overview

This sample application lets you retrieve multimedia data from the sample schema, save to a file, play, and delete from the sample schema image, audio, video, and testimonial data using the respective interMedia object types, OrdImage, OrdAudio, OrdVideo, and OrdDoc by product ID for rows in the PM.ONLINE_MEDIA table. Section 4.2 briefly describes how to compile and run the IMExample Java sample application. Section 4.3 describes the class files and shows code examples that illustrate how interMedia object types and methods and other Oracle objects are used.

4.2 Compiling and Running the IMExample Application

To compile the IMExample sample application, enter the following at the command line, assuming you are in the directory where the Java source files are located:

javac *.java

To run the IMExample sample application, enter the following at the command line:

java IMExample

4.3 Description of the IMExample Application

The IMExample sample application when compiled creates the following class files:

The major flow among these class files is: IMExample to IMExampleFrame to IMLoginDialog (login) to IMExampleFrame.showDefaultTable( ) to IMExampleQuery to IMProductDialog to one group of classes (IMImagePanel, IMAudioPanel, IMVideoPanel, IMDocPanel), and finally to the last group of classes (IMLoadFile, IMSaveFile, IMMediaPanel).

The remaining class files in this sample application include:


IMExample Class

This class makes a call to the interMedia OrdMediaUtil.imCompatibilityInit( ) method (see the bolded line in the code example) to allow compatibility with future releases of interMedia in case a database upgrade includes evolved object types, as follows:

protected static void setDBConnection(OracleConnection conn) throws Exception
{
   if (s_dbConn == null)
   {
      if (conn == null)
        throw new SQLException();
      s_dbConn = conn;

      // Allow compatibility with future versions.
   OrdMediaUtil.imCompatibilityInit(s_dbConn);
   }
   else
   {
       new IMMessage(IMConstants.ERROR, "ALREADY_CONNECTED");
   }
}

Calling the OrdMediaUtil.imCompatibilityInit( ) method is a recommended practice to help ensure client-side applications can maintain compatibility with the current release of the interMedia object types (OrdAudio, OrdImage, OrdVideo, OrdDoc, and OrdSource), in the event that there is a database upgrade that includes evolved object types.


IMProductDialog Class

This class defines the following methods followed by a description of what each does:

The following code example shows the loadMedia( ), displayMedia( ), displayImage( ), displayAudio( ), displayVideo( ), and displayDoc( ) methods, and highlights in bold the SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used. See the IMImagePanel Class, IMAudioPanel Class, IMVideoPanel Class, and IMDocPanel Class sections for code examples of the corresponding m_jXxxPanel.display( ) methods, where Xxx represents the particular media data type, Img, Aud, Vid, or Doc.

private void loadMedia() throws SQLException, IOException
  {
    String sQuery = 
"select product_photo, product_thumbnail, product_audio, product_video, " + 
"product_testimonials from pm.online_media where product_id = ? for update";

    OracleConnection conn = null;
    OracleResultSet rs = null;
    OraclePreparedStatement pstmt = null;
    boolean isInsertNeeded = false;
    byte[] ctx[] = new byte[1][64];

    try
    {
      conn = IMExample.getDBConnection();

      pstmt = (OraclePreparedStatement)conn.prepareStatement(sQuery);
      pstmt.setInt(1, m_iProdId);
      rs = (OracleResultSet)pstmt.executeQuery();
      if (rs.next() == true)
      {
m_img = (OrdImage)rs.getORAData(1, OrdImage.getORADataFactory());
m_imgThumb = (OrdImage)rs.getORAData(2, OrdImage.getORADataFactory());
m_aud = (OrdAudio)rs.getORAData(3, OrdAudio.getORADataFactory());
m_vid = (OrdVideo)rs.getORAData(4, OrdVideo.getORADataFactory());
m_doc = (OrdDoc)rs.getORAData(5, OrdDoc.getORADataFactory());
      }

      displayMedia();

      rs.close();
      pstmt.close();
    }
    finally
    {
      IMUtil.cleanup(rs, pstmt);
    }
  }

  private void displayMedia() throws SQLException, IOException
  {
    displayImage();
    displayAudio();
    displayVideo();
    displayDoc();
  }

  /**   * Add the product photo panel.
   */
  private void displayImage() throws SQLException, IOException
  {
m_jImgPanel = new IMImagePanel(this, 
m_img, m_imgThumb, m_iProdId, m_colorFieldBg);
    m_jImgPanel.display();
    m_jImgPanel.getAccessibleContext().setAccessibleName
      ("Product photo panel");
    m_jImgPanel.getAccessibleContext().setAccessibleDescription
      ("Product photo panel with an image icon on the left, " + 
       "image attribute panel in the middle and image control" +
        "panel on the right.");

    m_jMediaPanel.add(m_jImgPanel);

    Component jImgFocus = m_jImgPanel.getFirstFocusComponent();
    if (!m_isProdIlluFocused)
      m_jButtonRevert.setNextFocusableComponent(jImgFocus);
  }

  /**
   * Add the product audio panel.
   */
  private void displayAudio() throws SQLException, IOException
  {
m_jAudPanel = new IMAudioPanel(this, m_aud, m_iProdId, m_colorFieldBg);
    m_jAudPanel.display();
    m_jAudPanel.getAccessibleContext().setAccessibleName
      ("Product audio panel");
    m_jAudPanel.getAccessibleContext().setAccessibleDescription(
        "Product audio panel with an audio icon at the left, " + 
        "audio attribute panel in the middle and audio control" +
        "panel at the right.");
    m_jMediaPanel.add(m_jAudPanel);
  }

  /**
   * Add the product video panel.
   */
  private void displayVideo() throws SQLException, IOException
  {
m_jVidPanel = new IMVideoPanel(this, m_vid, m_iProdId, m_colorFieldBg); 
    m_jVidPanel.display();
    m_jVidPanel.getAccessibleContext().setAccessibleName
      ("Product audio panel");
    m_jVidPanel.getAccessibleContext().setAccessibleDescription(
        "Product audio panel with an video icon at the left, " + 
        "video attribute panel in the middle and video control" +
        "panel at the right.");
    m_jMediaPanel.add(m_jVidPanel);
  }

  /**
   * Add the product testimonials panel.
   */
  private void displayDoc() throws SQLException, IOException
  {
m_jDocPanel = new IMDocPanel(this, m _doc, m_iProdId, m_colorFieldBg);
    m_jDocPanel.display();
    m_jDocPanel.getAccessibleContext().setAccessibleName
      ("Product testimonials panel");
    m_jDocPanel.getAccessibleContext().setAccessibleDescription(
        "Product testimonials panel with an document icon at the left, " + 
        "testimonials attribute panel in the middle and testimonials control" +
        "panel at the right.");
    m_jMediaPanel.add(m_jDocPanel);
  }


IMImagePanel Class

This class displays the image panel, the product photo and its attributes, and the thumbnail image. What follows is a more detailed description of each of the methods that are defined and what each does:

The following code example includes the display( ), insertProperty( ), notExist( ), getDataInByteArray( ), and refreshPanel( ) methods, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used:

void display() throws IOException, SQLException
  {
    addControlPane();

if (notExist(m_img))
    {
      // The image does not exist.
      m_hasMedia = false; 
      layoutEmpty(s_sNotExist);
    }
    else
    {
      m_hasMedia = true; 
      // If image exists, try to show the attributes.
      if (insertProperty())
      {
        // Show the thumbnail image.
        // If the thumbnail image does not exist, generate it first.
if (m_imgThumb != null)
        {
String sFormat = m_imgThumb.getFormat();

if (notExist(m_imgThumb) ||
              ( !("JFIF".equalsIgnoreCase(sFormat)) &&
                !("GIFF".equalsIgnoreCase(sFormat))
              ))
          {
m_imgThumb = IMUtil.generateThumbnail(m_iProdId, m_img, m_imgThumb);
          }

byte[] thumbnail = getDataInByteArray(m_imgThumb);
          addThumbnail(thumbnail);
        }
        else
        {
m_imgThumb = IMUtil.generateThumbnail(m_iProdId, m_img, m_imgThumb);
byte[] thumbnail = getDataInByteArray(m_imgThumb);
          addThumbnail(thumbnail);
        }
      }
    }
  }
.
.
.
  boolean insertProperty() throws SQLException
  {
    boolean isFormatSupported = false;
String sMimeType = m_img.getMimeType();

    if (sMimeType == null)
isFormatSupported = IMUtil.setProperties(m_img);
    else
      isFormatSupported = true;

    if (!isFormatSupported)
    {
      layoutEmpty(s_sNotSupported);
    }
    else
    {
      Object[][] data = 
      {
{"MIME Type",  m_img.getMimeType()},
{"Height", new Integer(m_img.getHeight()).toString()},
{"Width",  new Integer(m_img.getWidth()).toString()},
{"Content Length", new Integer(m_img.getContentLength()).toString()}
      };

      IMAttrTableModel tm = new IMAttrTableModel(data, m_attrColNames);

      m_jAttrTbl = new IMTable(tm);
      m_jAttrScrollPane = new JScrollPane(m_jAttrTbl);
      m_jAttrScrollPane.setPreferredSize(new Dimension(300, 84));

      if (m_isGridLayout)
        addMediaComponent(m_jAttrScrollPane, 0, 1, 0.6, 6, 
            GridBagConstraints.CENTER, true);
      else
      {
        m_jAttrPane.setLayout(new GridBagLayout());
        addMediaComponent(m_jAttrPane, m_jAttrScrollPane, 0, 1);
      }
    }

    return isFormatSupported;  }
.
.
.
  static boolean notExist(OrdImage img) throws SQLException, IOException
  {
if (img == null)
      return true;
    else
    {
if (img.isLocal() && (img.getDataInByteArray() == null))
        return true;
else if (!img.isLocal() && (":///".equals(img.getSource())))
        return true;
      else
      {
if (!img.isLocal())
        {
BFILE bfile = img.getBFILE();
if (!bfile.fileExists())
            return true;
          else 
            return false;
        }
        else
          return false;
      }
    }
  }
.
.
.
static byte[] getDataInByteArray(OrdImage img) throws SQLException, IOException
  {
if (notExist(img))
      return null;
    else
    {
if (!img.isLocal())
      {
        byte[] ctx[] = new byte[1][4000];
        try
        {
img.importData(ctx);
        }
        catch (SQLException e)
        {
          new IMMessage(IMConstants.ERROR, "MEDIA_SOURCE_ERR", e);
          return null;
        }
      }
return img.getDataInByteArray();
    }
  }
.
.
.
  void refreshPanel(boolean isFormatSupported) throws SQLException, IOException
  {
    m_hasMedia = true;
    if (isFormatSupported)
    {
      if (m_jAttrTbl == null)
      {
        m_jAttrPane.remove(m_jEmpty);
        m_jIconPane.remove(m_jIcon);

byte[] thumbnail = getDataInByteArray(m_imgThumb);
        addThumbnail(thumbnail);

        insertProperty();
      }
      else
      {
byte[] thumbnail = getDataInByteArray(m_imgThumb);
        changThumbnail(thumbnail);

m_jAttrTbl.setValueAt(m_img.getMimeType(), 0, 1);
m_jAttrTbl.setValueAt(new Integer(m_img.getHeight()).toString(), 1, 1);
m_jAttrTbl.setValueAt(new Integer(m_img.getWidth()).toString(), 2, 1);
m_jAttrTbl.setValueAt(new Integer(m_img.getContentLength()).toString(),3, 1);
      }
    }
    else
    {
      if (m_jAttrTbl == null)
      {
        m_jEmpty.setText(s_sNotSupported);
      }
      else
      {
        m_jAttrTbl = null;
        m_jAttrPane.remove(m_jAttrScrollPane);
        m_jAttrPane.setLayout(new BorderLayout());
        m_jIconPane.remove(m_jIcon);
        layoutEmpty(s_sNotSupported);
      }
    }
    m_jAttrPane.validate();
    m_jIconPane.validate();
    validate();
  }


IMVideoPanel Class

This class displays the video panel, the product video, and its attributes. This class is identical in structure and functions similarly to the IMImagePanel class. See the IMImagePanel Class section for descriptions of methods. The following code example includes the display( ), insertProperty( ), notExist( ), getDataInByteArray( ), and refreshPanel( ) methods, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used:

void display() throws IOException, SQLException
  {
    addControlPane();

    // Set the video icon.
    m_jIcon = new JLabel(new ImageIcon(IMExampleFrame.class.getResource("OrdVideo.gif")));
    m_jIcon.setLabelFor(m_jAttrPane);

    if (m_isGridLayout)
      addMediaComponent(m_jIcon, 3, 0, 0.4, 3, GridBagConstraints.CENTER);
    else
      m_jIconPane.add(m_jIcon, BorderLayout.CENTER);

    if (notExist())
    {
      // The video does not exist.
      m_hasMedia = false; 
      layoutEmpty(s_sNotExist);
    }
    else
    {
      m_hasMedia = true; 
      // If the video exists, try to show the attributes.
      insertProperty();
    }
  }
.
.
.
  boolean insertProperty() throws SQLException
  {
    boolean isFormatSupported = false;
String sMimeType = m_vid.getMimeType();

    if (sMimeType == null)
isFormatSupported = IMUtil.setProperties(m_vid);
    else
      isFormatSupported = true;

    if (!isFormatSupported)
    {
      layoutEmpty(s_sNotSupported);
    }
    else
    {
      Object[][] data = 
      {
{"MIME Type",  m_vid.getMimeType()},
{"Height", new Integer(m_vid.getHeight()).toString()},
{"Width",  new Integer(m_vid.getWidth()).toString()},
{"Duration", new Integer(m_vid.getVideoDuration()).toString()},
{"Content Length", new Integer(m_vid.getContentLength()).toString()}
      };
      IMAttrTableModel tm = new IMAttrTableModel(data, m_attrColNames);

      m_jAttrTbl = new IMTable(tm);
      m_jAttrScrollPane = new JScrollPane(m_jAttrTbl);
      m_jAttrScrollPane.setPreferredSize(new Dimension(300, 100));
      if (m_isGridLayout)
        addMediaComponent(m_jAttrScrollPane, 0, 1, 0.6, 6, GridBagConstraints.CENTER, true);
      else
      {
        m_jAttrPane.setLayout(new GridBagLayout());
        addMediaComponent(m_jAttrPane, m_jAttrScrollPane, 0, 1);
      }
    }

    return isFormatSupported;  }
.
.
.
  boolean notExist() throws SQLException, IOException
  {
if (m_vid == null)
      return true;
    else
    {
if (m_vid.isLocal() && (m_vid.getDataInByteArray() == null))
        return true;
else if (!m_vid.isLocal() && (":///".equals(m_vid.getSource())))
        return true;
      else
      {
if (!m_vid.isLocal())
        {
BFILE bfile = m_vid.getBFILE();
if (!bfile.fileExists())
            return true;
          else 
            return false;
        }
        else
          return false;
      }
    }
  }
.
.
.
byte[] getDataInByteArray(OrdVideo vid) throws SQLException, IOException
  {
    if (!m_hasMedia)
      return null;
    else
    {
if (!vid.isLocal())
      {
        byte[] ctx[] = new byte[1][4000];
        try
        {
vid.importData(ctx);
        }
        catch (SQLException e)
        {
          new IMMessage(IMConstants.ERROR, "MEDIA_SOURCE_ERR", e);
          return null;
        }
      }
return vid.getDataInByteArray();
    }
  }
.
.
.
  void refreshPanel(boolean isFormatSupported) throws SQLException, IOException
  {
    m_hasMedia = true;

    if (isFormatSupported)
    {
      if (m_jAttrTbl == null)
      {
        m_jAttrPane.remove(m_jEmpty);
        insertProperty();
      }
      else
      {
m_jAttrTbl.setValueAt(m_vid.getMimeType(), 0, 1);
m_jAttrTbl.setValueAt(new Integer(m_vid.getHeight()).toString(), 1, 1);
m_jAttrTbl.setValueAt(new Integer(m_vid.getWidth()).toString(), 2, 1);
m_jAttrTbl.setValueAt(new Integer(m_vid.getVideoDuration()).toString(), 3, 1);
m_jAttrTbl.setValueAt(new Integer(m_vid.getContentLength()).toString(), 4, 1);
      }
    }
    else
    {
      if (m_jAttrTbl == null)
      {
        m_jEmpty.setText(s_sNotSupported);
      }
      else
      {
        m_jAttrTbl = null;
        m_jAttrPane.remove(m_jAttrScrollPane);
        m_jAttrPane.setLayout(new BorderLayout());

        layoutEmpty(s_sNotSupported);
      }
    }

    m_jAttrPane.validate();
    validate();
  }


IMAudioPanel Class

This class displays the audio panel, the product audio, and its attributes. This class is identical in structure and functions similarly to the IMImagePanel class. See the IMImagePanel Class section for descriptions of methods. The following code example includes the display( ), insertProperty( ), notExist( ), getDataInByteArray( ), and refreshPanel( ) methods, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used:

void display() throws IOException, SQLException
  {
    addControlPane();

    // Set the audio icon.
    m_jIcon = new JLabel(new ImageIcon(IMExampleFrame.class.getResource("OrdAudio.gif")));
    m_jIcon.setLabelFor(m_jAttrPane);

    if (m_isGridLayout)
      addMediaComponent(m_jIcon, 3, 0, 0.4, 3, GridBagConstraints.CENTER);
    else
      m_jIconPane.add(m_jIcon, BorderLayout.CENTER);

    if (notExist())
    {
      // The audio does not exist.
      m_hasMedia = false; 
      layoutEmpty(s_sNotExist);
    }
    else
    {
      m_hasMedia = true;

      // If the audio exists, try to show the attributes.
      insertProperty();
    }
  }
.
.
.
  boolean insertProperty() throws SQLException
  {
    boolean isFormatSupported = false;
String sMimeType = m_aud.getMimeType();

    if (sMimeType == null)
isFormatSupported = IMUtil.setProperties(m_aud);
    else
      isFormatSupported = true;

    if (!isFormatSupported)
    {
      layoutEmpty(s_sNotSupported);
    }
    else
    {
      Object[][] data = 
      {
{"MIME Type",  sMimeType},
{"Duration", new Integer(m_aud.getAudioDuration()).toString()},
{"Content Length", new Integer(m_aud.getContentLength()).toString()}
      };

      IMAttrTableModel tm = new IMAttrTableModel(data, m_attrColNames);

      m_jAttrTbl = new IMTable(tm);
      m_jAttrScrollPane = new JScrollPane(m_jAttrTbl);
      m_jAttrScrollPane.setPreferredSize(new Dimension(300, 68));

      if (m_isGridLayout)
        addMediaComponent(m_jAttrScrollPane, 0, 1, 0.6, 6, 
            GridBagConstraints.CENTER, true);
      else
      {
        m_jAttrPane.setLayout(new GridBagLayout());
        addMediaComponent(m_jAttrPane, m_jAttrScrollPane, 0, 1);
      }
    }

    return isFormatSupported;
  }
.
.
.
  boolean notExist() throws SQLException, IOException
  {
if (m_aud == null)
      return true;
    else
    {
if (m_aud.isLocal() && (m_aud.getDataInByteArray() == null))
        return true;
else if (!m_aud.isLocal() && (":///".equals(m_aud.getSource())))
        return true;
      else
      {
if (!m_aud.isLocal())
        {
BFILE bfile = m_aud.getBFILE();
if (!bfile.fileExists())
            return true;
          else 
            return false;
        }
        else
          return false;
      }
    }
  }
.
.
.
byte[] getDataInByteArray(OrdAudio aud) throws SQLException, IOException
  {
    if (!m_hasMedia)
      return null;
    else
    {
if (!aud.isLocal())
      {
        byte[] ctx[] = new byte[1][4000];
        try
        {
aud.importData(ctx);
        }
        catch (SQLException e)
        {
          new IMMessage(IMConstants.ERROR, "MEDIA_SOURCE_ERR", e);
          return null;
        }
      }
return aud.getDataInByteArray();
    }
  }
.
.
.
  void refreshPanel(boolean isFormatSupported) throws SQLException, IOException
  {
    m_hasMedia = true;
    if (isFormatSupported)
    {
      if (m_jAttrTbl == null)
      {
        m_jAttrPane.remove(m_jEmpty);
        insertProperty();
      }
      else
      {
m_jAttrTbl.setValueAt(m_aud.getMimeType(), 0, 1);
m_jAttrTbl.setValueAt(new Integer(m_aud.getAudioDuration()).toString(), 1, 1);
m_jAttrTbl.setValueAt(new Integer(m_aud.getContentLength()).toString(), 2, 1);
      }
    }
    else
    {
      if (m_jAttrTbl == null)
      {
        m_jEmpty.setText(s_sNotSupported);
      }
      else
      {
        m_jAttrTbl = null;
        m_jAttrPane.remove(m_jAttrScrollPane);
        m_jAttrPane.setLayout(new BorderLayout());

        layoutEmpty(s_sNotSupported);
      }
    }
    m_jAttrPane.validate();
    validate();
  }


IMDocPanel Class

This class displays the doc panel, the product testimonials, and its attributes. This class is identical in structure and functions similarly to the IMImagePanel class. See the IMImagePanel Class section for descriptions of methods. The following code example includes the display( ), insertProperty( ), notExist( ), getDataInByteArray( ), and refreshPanel( ) methods, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used:

void display() throws IOException, SQLException
  {
    addControlPane();

    // Set the icon.
    m_jIcon = new JLabel(new ImageIcon(
          IMExampleFrame.class.getResource("OrdDoc.gif")
          ));
    m_jIcon.setLabelFor(m_jAttrPane);
    if (m_isGridLayout)
      addMediaComponent(m_jIcon, 3, 0, 0.4, 3, GridBagConstraints.CENTER);
    else
      m_jIconPane.add(m_jIcon, BorderLayout.CENTER);

    if (notExist())
    {
      // The doc does not exist.
      m_hasMedia = false; 
      layoutEmpty(s_sNotExist);
    }
    else
    {
      // If the doc exists, show the attribute table.
      m_hasMedia = true; 
      insertProperty();
    }
  }
.
.
.
  boolean insertProperty() throws SQLException
  {
    boolean isFormatSupported = false;
String sMimeType = m_doc.getMimeType();

    if (sMimeType == null)
isFormatSupported = IMUtil.setProperties(m_doc);
    else
      isFormatSupported = true;

    if (!isFormatSupported)
    {
      layoutEmpty(s_sNotSupported);
    }
    else
    {
      Object[][] data = 
      {
{"MIME Type",  m_doc.getMimeType()},
{"Content Length", new Integer(m_doc.getContentLength()).toString()}
      };

      IMAttrTableModel tm = new IMAttrTableModel(data, m_attrColNames);

      m_jAttrTbl = new IMTable(tm);
      m_jAttrScrollPane = new JScrollPane(m_jAttrTbl);
      m_jAttrScrollPane.setPreferredSize(new Dimension(300, 52));

      if (m_isGridLayout)
        addMediaComponent(m_jAttrScrollPane, 0, 1, 0.6, 6, 
            GridBagConstraints.CENTER, true);
      else
      {
        m_jAttrPane.setLayout(new GridBagLayout());
        addMediaComponent(m_jAttrPane, m_jAttrScrollPane, 0, 1);
      }
    }

    return isFormatSupported;
  }
.
.
.
  boolean notExist() throws SQLException, IOException
  {
if (m_doc == null)
      return true;
    else
    {
if (m_doc.isLocal() && (m_doc.getDataInByteArray() == null))
        return true;
else if (!m_doc.isLocal() && (":///".equals(m_doc.getSource())))
        return true;
      else
      {
if (!m_doc.isLocal())
        {
BFILE bfile = m_doc.getBFILE();
if (!bfile.fileExists())
            return true;
          else 
            return false;
        }
        else
          return false;
      }
    }
  }
.
.
.
byte[] getDataInByteArray(OrdDoc doc) throws SQLException, IOException
  {
    if (!m_hasMedia)
      return null;
    else
    {
if (!doc.isLocal())
      {
        byte[] ctx[] = new byte[1][4000];
        try
        {
doc.importData(ctx, false);
        }
        catch (SQLException e)
        {
          new IMMessage(IMConstants.ERROR, "MEDIA_SOURCE_ERR", e);
          return null;
        }
      }
return doc.getDataInByteArray();
    }
  }
.
.
.
  void refreshPanel(boolean isFormatSupported) throws SQLException, IOException
  {
    m_hasMedia = true;
    if (isFormatSupported)
    {
      if (m_jAttrTbl == null)
      {
        m_jAttrPane.remove(m_jEmpty);
        insertProperty();
      }
      else
      {
m_jAttrTbl.setValueAt(m_doc.getMimeType(), 0, 1);
m_jAttrTbl.setValueAt(new Integer(m_doc.getContentLength()).toString(), 1, 1);
      }
    }
    else
    {
      if (m_jAttrTbl == null)
      {
        m_jEmpty.setText(s_sNotSupported);
      }
      else
      {
        m_jAttrTbl = null;
        m_jAttrPane.remove(m_jAttrScrollPane);
        m_jAttrPane.setLayout(new BorderLayout());
        layoutEmpty(s_sNotSupported);
      }
    }
    m_jAttrPane.validate();
    validate();
  }


IMLoadFile Class

This class loads a media stream from a file to a database for each of the media object types. First, it checks to see if this PRODUCT_ID column exists in the PM.ONLINE_MEDIA table and if not, it inserts a new row into the table. Then, it creates and initializes a new media object for each media object type, updates the media data, that is, loads it into the database if it is not already stored there, and finally, sets the media attributes for each media data object.

In this class, the IMFileLoad( ) method calls the initFileChooser( ) method, then the initFileChooser( ) method calls the loadNewMedia( ) method, which does the row insertion and initializing of the media object type columns, and then calls the updateMedia( ) method to update the media and to set the media attributes.

The following code example includes the loadNewMedia( ) and UpdateMedia( ) methods, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used as previously described:

private void loadNewMedia() 
    throws SQLException, FileNotFoundException, SecurityException, IOException
  {
    boolean isInsertNeeded = false;
    String sQuery = null;
    OracleConnection conn = null;
    OracleResultSet rs = null;
    OraclePreparedStatement pstmt = null;

    try
    {
      conn = IMExample.getDBConnection();

      if (m_obj == null)
      {
        // First, check whether or not this product exists in the 
        // pm.online_media table. If it exists, isInsertNeeded is set to false;
        // or else, isInsertNeeded is set to true.
        sQuery = new String(
"select product_id from pm.online_media where product_id = ?");
        pstmt = (OraclePreparedStatement) conn.prepareStatement(sQuery);
        pstmt.setInt(1, m_iProdId);
        rs = (OracleResultSet)pstmt.executeQuery();
        if (rs.next() == false)
          isInsertNeeded = true;
        else
          isInsertNeeded = false;
        rs.close();
        pstmt.close();

        if (isInsertNeeded)
        {
          // If this product is not in the pm.online_media table, 
          // insert a row in pm.online_media for this product,
          // and initialize the media object at the same time.
          sQuery = new String(
"insert into pm.online_media (product_id, product_photo, " + 
"product_photo_signature, product_thumbnail, product_video, " + 
"product_audio, product_text, product_testimonials) values (" + 
"?, ORDSYS.ORDImage.init(), ORDSYS.ORDImageSignature.init(), " +
"ORDSYS.ORDImage.init(),  ORDSYS.ORDVideo.init(), " +
"ORDSYS.ORDAudio.init(), null, ORDSYS.ORDDoc.init())");

          pstmt = (OraclePreparedStatement) conn.prepareCall(sQuery);
          pstmt.setInt(1, m_iProdId);
          pstmt.execute();
          pstmt.close();
        }
      }

      // Create a new media object.
      switch (m_iTypeIdentifier)
      {
        case IMG_TYPE:
          sQuery = new String(
"update pm.online_media set " + m_sColName + 
" = ORDSYS.ORDImage.init() where product_id = ?");
          break;
        case AUD_TYPE:
          sQuery = new String(
"update pm.online_media set " + m_sColName +
" = ORDSYS.ORDAudio.init() where product_id = ?");
          break;
        case VID_TYPE:
          sQuery = new String(
"update pm.online_media set " + m_sColName + 
" = ORDSYS.ORDVideo.init() where product_id = ?");
          break;
        case DOC_TYPE:
          sQuery = new String(
"update pm.online_media set " + m_sColName +  
" = ORDSYS.ORDDoc.init() where product_id = ?"); 
          break;
        default:
          new IMMessage(IMConstants.ERROR, "UNKNOWN_TYPE");
          break;
      }

      pstmt = (OraclePreparedStatement) conn.prepareCall(sQuery);
      pstmt.setInt(1, m_iProdId);
      pstmt.execute();
      pstmt.close();

      // At this point, there is a row in the online_media table
      // for this product and the desired media object is initialized.
      // In the following, we update the media object pointer and 
      // acquire the right to modify it by selecting again from the
      // database.
      //
      sQuery = new String(
          "select " + m_sColName + 
          " from pm.online_media where product_id = ? for update");
      pstmt = (OraclePreparedStatement) conn.prepareStatement(sQuery);
      pstmt.setInt(1, m_iProdId);
      rs = (OracleResultSet)pstmt.executeQuery();
      if (rs.next() == false)
        throw new SQLException();
      else
      {
        switch (m_iTypeIdentifier)
        {
          case IMG_TYPE:
m_img = (OrdImage)rs.getORAData(1, OrdImage.getORADataFactory());
            break;
          case AUD_TYPE:
m_aud = (OrdAudio)rs.getORAData(1, OrdAudio.getORADataFactory());
            break;
          case VID_TYPE:
m_vid = (OrdVideo)rs.getORAData(1, OrdVideo.getORADataFactory());
            break;
          case DOC_TYPE:
m_doc = (OrdDoc)rs.getORAData(1, OrdDoc.getORADataFactory());
            break;
          default:
            new IMMessage(IMConstants.ERROR, "UNKNOWN_TYPE");
            break;
        }

        // Update the media object.
        updateMedia();
      }

      rs.close();
      pstmt.close();
    }
    finally
    {
      IMUtil.cleanup(rs, pstmt);
    }
  }

  /**
   * Update the media and also set the media properties.
   */
  private void updateMedia()
    throws SQLException, FileNotFoundException, SecurityException, IOException
  {
    String sQuery = null;
    OracleConnection conn = null;
    byte[] ctx[] = new byte[1][64];
    OraclePreparedStatement pstmt = null;

    boolean isFormatSupported = false;

    try
    {
      conn = IMExample.getDBConnection();
      sQuery = new String(
"update pm.online_media set " + m_sColName + 
" = ? where product_id = ?");
      pstmt = (OraclePreparedStatement) conn.prepareCall(sQuery);
      pstmt.setInt(2, m_iProdId);

      switch (m_iTypeIdentifier)
      {
        case IMG_TYPE:
m_img.loadDataFromFile(m_jFileChooser.getText());
isFormatSupported = IMUtil.setProperties(m_img);
m_img.setLocal();
pstmt.setORAData(1, m_img);
          break;
        case AUD_TYPE:
m_aud.loadDataFromFile(m_jFileChooser.getText());
isFormatSupported = IMUtil.setProperties(m_aud);
m_aud.setLocal();
pstmt.setORAData(1, m_aud);

          // We need to update the media pointer for display,
          // because the input media pointer may be null.
((IMAudioPanel)m_parent).setMedia(m_aud);
          ((IMAudioPanel)m_parent).refreshPanel(isFormatSupported);
          break;
        case VID_TYPE:
m_vid.loadDataFromFile(m_jFileChooser.getText());
isFormatSupported = IMUtil.setProperties(m_vid);
m_vid.setLocal();
pstmt.setORAData(1, m_vid);

((IMVideoPanel)m_parent).setMedia(m_vid);
          ((IMVideoPanel)m_parent).refreshPanel(isFormatSupported);
          break;
        case DOC_TYPE:
m_doc.loadDataFromFile(m_jFileChooser.getText());
isFormatSupported = IMUtil.setProperties(m_doc);
m_doc.setLocal();
pstmt.setORAData(1, m_doc);

((IMDocPanel)m_parent).setMedia(m_doc);
          ((IMDocPanel)m_parent).refreshPanel(isFormatSupported);
          break;
        default:
          new IMMessage(IMConstants.ERROR, "UNKNOWN_TYPE");
          break;
      }

      pstmt.execute();
      pstmt.close();

      // Update the thumbnail image.
      if (m_iTypeIdentifier == IMG_TYPE)
      {
        if (isFormatSupported)
m_imgThumb = IMUtil.generateThumbnail(m_iProdId, m_img, m_imgThumb);

((IMImagePanel)m_parent).setMedia(m_img, m_imgThumb);
        ((IMImagePanel)m_parent).refreshPanel(isFormatSupported);
      }
    }
    finally
    {
      IMUtil.cleanup(pstmt);
    }
  }


IMUtil Class

This class contains common utilities, such as a generateThumbnail( ) static method, wrapper methods for the setProperties( ) methods for each media object type to separate the exceptions caused by unrecognizable formats, and finally, a number of cleanup methods. The following code example includes the generateThumbnail( ) method, and highlights in bold any SQL query statements and areas in the code where interMedia and other Oracle object types and methods are used:

static OrdImage generateThumbnail(int iProdId, OrdImage img, OrdImage imgThumb)
  throws SQLException
  {
    String sQuery = null;
    OracleConnection conn = null;
    OracleResultSet rs = null;
    OraclePreparedStatement pstmt = null;

    try
    {
      conn = IMExample.getDBConnection();

      if (imgThumb == null)
      {
        // The thumbnail media pointer is not initialized.
        // Initialize it first.
        sQuery = new String(
"update pm.online_media set product_thumbnail = " + 
"ORDSYS.ORDImage.init() where product_id = ?");
        pstmt = (OraclePreparedStatement) conn.prepareCall(sQuery);
        pstmt.setInt(1, iProdId);
        pstmt.execute();
        pstmt.close();

        // Acquire the new pointer and the permission to update.
        sQuery = new String("select product_thumbnail from pm.online_media " +
"where product_id = ? for update");
        pstmt = (OraclePreparedStatement) conn.prepareStatement(sQuery);
        pstmt.setInt(1, iProdId);
        rs = (OracleResultSet)pstmt.executeQuery();
        if (rs.next() == false)
          throw new SQLException();
        else
imgThumb = (OrdImage)rs.getORAData(1, OrdImage.getORADataFactory());

        rs.close();
        pstmt.close();
      }

      // Generate the thumbnail image.
img.processCopy("maxScale=64 64, fileFormat=GIFF", imgThumb);
imgThumb.setProperties();
imgThumb.setLocal();

      // Update the thumbnail image in the database.
      sQuery = new String(
"update pm.online_media set product_thumbnail = ? where product_id = ?");
      pstmt = (OraclePreparedStatement) conn.prepareCall(sQuery);
      pstmt.setORAData(1, imgThumb);
      pstmt.setInt(2, iProdId);
      pstmt.execute();
      pstmt.close();

      return imgThumb;
    }
    finally
    {
      IMUtil.cleanup(rs, pstmt);
    }
  }