4 Replies Latest reply: Feb 2, 2012 11:45 AM by 817614 RSS

    Newbie question

    913747
      I'm trying to use FileOpenService and am getting an UnavailableServiceException with the message "uninitialized". Can anyone tell me what I'm doing wrong?

      I have a few applications and applets already working with Java Web Start but I am completely new to using the JNLP services. I assume I've set something up incorrectly.

      I'm trying to execute my application in Eclipse 3.7. I've added the jnlp.jar from my 1.6.0_18 JDK to the project and my code compiles fine but I get the exception when I actually try to run the program in Eclipse. The application I'm trying to execute is the JWSFileChooserDemo from the Java Tutorial. I've tweaked the catch block a bit to tell me what's wrong. My application is listed at the end of this post.

      In case it matters, I'm running Windows XP Professional SP3.

      I've googled and seen other people complaining of the same issue but haven't seen any resolutions.


      /*
      * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
      *
      * Redistribution and use in source and binary forms, with or without
      * modification, are permitted provided that the following conditions
      * are met:
      *
      * - Redistributions of source code must retain the above copyright
      * notice, this list of conditions and the following disclaimer.
      *
      * - Redistributions in binary form must reproduce the above copyright
      * notice, this list of conditions and the following disclaimer in the
      * documentation and/or other materials provided with the distribution.
      *
      * - Neither the name of Oracle or the names of its
      * contributors may be used to endorse or promote products derived
      * from this software without specific prior written permission.
      *
      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
      * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
      * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
      * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
      * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
      * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
      * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
      * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
      * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
      * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
      * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      */

      package test;

      import java.awt.*;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      import java.io.ByteArrayInputStream;
      import java.io.IOException;
      import javax.swing.*;
      import javax.swing.filechooser.*;
      import javax.swing.SwingUtilities;
      import javax.jnlp.*;

      /*
      * JWSFileChooserDemo.java must be compiled with jnlp.jar. For
      * example, if jnlp.jar is in a subdirectory named jars:
      *
      * javac -classpath .:jars/jnlp.jar JWSFileChooserDemo.java [UNIX]
      * javac -classpath .;jars/jnlp.jar JWSFileChooserDemo.java [Microsoft Windows]
      *
      * JWSFileChooserDemo.java requires the following files when executing:
      * images/Open16.gif
      * images/Save16.gif
      */
      /**
      * @author Java Tutorial
      *
      */
      @SuppressWarnings("serial")
      public class JWSFileChooserDemo extends JPanel
      implements ActionListener {
      static private final String newline = "\n"; //$NON-NLS-1$
      JButton openButton, saveButton;
      JTextArea log;

      /**
      * Constructor.
      */
      public JWSFileChooserDemo() {
      super(new BorderLayout());

      //Create the log first, because the action listeners
      //need to refer to it.
      this.log = new JTextArea(5,20);
      this.log.setMargin(new Insets(5,5,5,5));
      this.log.setEditable(false);
      JScrollPane logScrollPane = new JScrollPane(this.log);

      //Create the open button. We use the image from the JLF
      //Graphics Repository (but we extracted it from the jar).
      this.openButton = new JButton("Open a File..."); // createImageIcon("images/open24.gif")); //$NON-NLS-1$ //$NON-NLS-2$
      this.openButton.addActionListener(this);

      //Create the save button. We use the image from the JLF
      //Graphics Repository (but we extracted it from the jar).
      this.saveButton = new JButton("Save a File..."); // createImageIcon("images/save24.gif")); //$NON-NLS-1$ //$NON-NLS-2$
      this.saveButton.addActionListener(this);

      //For layout purposes, put the buttons in a separate panel
      JPanel buttonPanel = new JPanel();
      buttonPanel.add(this.openButton);
      buttonPanel.add(this.saveButton);

      //Add the buttons and the log to this panel.
      add(buttonPanel, BorderLayout.PAGE_START);
      add(logScrollPane, BorderLayout.CENTER);
      }

      @Override
           public void actionPerformed(ActionEvent e) {

      //Handle open button action.
      if (e.getSource() == this.openButton) {
      FileOpenService fos = null;
      FileContents fileContents = null;

      try {
      fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); //$NON-NLS-1$
      } catch (UnavailableServiceException exc) {
           System.err.println("lookup for FileOpenService failed. Message: " + exc.getMessage());
           exc.printStackTrace();
      }

      if (fos != null) {
      try {
      fileContents = fos.openFileDialog(null, null);
      } catch (Exception exc) {
      this.log.append("Open command failed: " //$NON-NLS-1$
      + exc.getLocalizedMessage()
      + newline);
      this.log.setCaretPosition(this.log.getDocument().getLength());
      }
      }

      if (fileContents != null) {
      try {
      //This is where a real application would do something
      //with the file.
      this.log.append("Opened file: " + fileContents.getName() //$NON-NLS-1$
      + "." + newline); //$NON-NLS-1$
      } catch (IOException exc) {
      this.log.append("Problem opening file: " //$NON-NLS-1$
      + exc.getLocalizedMessage()
      + newline);
      }
      } else {
      this.log.append("User canceled open request." + newline); //$NON-NLS-1$
      }
      this.log.setCaretPosition(this.log.getDocument().getLength());
      }

      //Handle save button action.
      if (e.getSource() == this.saveButton) {
      FileSaveService fss = null;
      FileContents fileContents = null;
      ByteArrayInputStream is = new ByteArrayInputStream(
      (new String("Saved by JWSFileChooserDemo").getBytes())); //$NON-NLS-1$
      //XXX YIKES! If they select an
      //XXX existing file, this will
      //XXX overwrite that file.

      try {
      fss = (FileSaveService)ServiceManager.
      lookup("javax.jnlp.FileSaveService"); //$NON-NLS-1$
      } catch (UnavailableServiceException exc) { }

      if (fss != null) {
      try {
      fileContents = fss.saveFileDialog(null,
      null,
      is,
      "JWSFileChooserDemo.txt"); //$NON-NLS-1$
      } catch (Exception exc) {
      this.log.append("Save command failed: " //$NON-NLS-1$
      + exc.getLocalizedMessage()
      + newline);
      this.log.setCaretPosition(this.log.getDocument().getLength());
      }
      }

      if (fileContents != null) {
      try {
      this.log.append("Saved file: " + fileContents.getName() //$NON-NLS-1$
      + "." + newline); //$NON-NLS-1$
      } catch (IOException exc) {
      this.log.append("Problem saving file: " //$NON-NLS-1$
      + exc.getLocalizedMessage()
      + newline);
      }
      } else {
      this.log.append("User canceled save request." + newline); //$NON-NLS-1$
      }
      this.log.setCaretPosition(this.log.getDocument().getLength());
      }
      }

      /** Returns an ImageIcon, or null if the path was invalid. */
      protected ImageIcon createImageIcon(String path) {
      // java.net.URL imgURL = JWSFileChooserDemo.class.getResource(path);
      java.net.URL imgURL = this.getClass().getResource(path);
      if (imgURL != null) {
      return new ImageIcon(imgURL);
      } else {
      System.err.println("Couldn't find file: " + path); //$NON-NLS-1$
      return null;
      }
      }

      /**
      * Create the GUI and show it. For thread safety,
      * this method should be invoked from the
      * event dispatch thread.
      */
      private static void createAndShowGUI() {
      //Create and set up the window.
      JFrame frame = new JFrame("JWSFileChooserDemo"); //$NON-NLS-1$
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      //Add content to the window.
      frame.add(new JWSFileChooserDemo());

      //Display the window.
      frame.pack();
      frame.setVisible(true);
      }

      public static void main(String[] args) {
      //Schedule a job for the event dispatch thread:
      //creating and showing this application's GUI.
      SwingUtilities.invokeLater(new Runnable() {
      @Override
                     public void run() {
      //Turn off metal's use of bold fonts
      UIManager.put("swing.boldMetal", Boolean.FALSE); //$NON-NLS-1$
      createAndShowGUI();
      }
      });
      }
      }
        • 1. Re: Newbie question
          AndyHerrick
          The JNLP Services are only available to an application when running inside of Java Web Start.
          When running inside of Eclipse you are running the app as a stand alone applications and have no JNLP Services available.
          • 2. Re: Newbie question
            913747
            I had been led to believe that if I put the jnlp.jar in my Eclipse project - and installed a Java Web Start plugin - I'd be able to test my code in Eclipse. Are you saying that's not true?

            Isn't there any way to create a JNLPish environment in Eclipse so that I can test code there? Or do I have to test everything "live"?
            • 3. Re: Newbie question
              gimbal2
              Doesn't seem like the tech was really built for test driven development. I did find this little tidbit by searching around a bit:

              http://lopica.sourceforge.net/faq.html#debug

              Perhaps it is of use to you.
              • 4. Re: Newbie question
                817614
                You could have a Java SE project configured as WebStart and be able to run or debugged it right inside the IDE without any additional effort. Check out latest NetBeans 7.1 from http://netbeans.org.

                Alternatively, you could just refer to development tips from this troubleshooting guide:
                http://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-Desktop/html/plugin.html
                to setup your WebStart development environment.