/*
* JNLPServiceManager.java
*
* Created on February 1, 2001, 12:53 PM
*/
package org.freehep.application.services.jnlp;
import java.awt.BorderLayout;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Printable;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Properties;
import javax.jnlp.BasicService;
import javax.jnlp.ClipboardService;
import javax.jnlp.DownloadService;
import javax.jnlp.DownloadServiceListener;
import javax.jnlp.FileContents;
import javax.jnlp.FileOpenService;
import javax.jnlp.FileSaveService;
import javax.jnlp.PersistenceService;
import javax.jnlp.PrintService;
import javax.jnlp.UnavailableServiceException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
import org.freehep.application.Application;
import org.freehep.application.services.FileAccess;
import org.freehep.application.services.ServiceManager;
/**
*
* @author tonyj
* @version $Id: JNLPServiceManager.java 8584 2006-08-10 23:06:37Z duns $
*/
public class JNLPServiceManager implements ServiceManager
{
private FileOpenService fileOpenService;
private FileSaveService fileSaveService;
private PrintService printService;
private BasicService basicService;
private PersistenceService persistenceService;
private DownloadService downloadService;
private ClipboardService clipboardService;
private Application app;
/** Creates new JNLPServiceManager */
public JNLPServiceManager()
{
app = Application.getApplication();
}
private Object createService(String serviceName)
{
try
{
return javax.jnlp.ServiceManager.lookup(serviceName);
}
catch (UnavailableServiceException x)
{
throw new RuntimeException("Could not find "+serviceName);
}
}
private PrintService createPrintService()
{
return (PrintService) createService("javax.jnlp.PrintService");
}
private BasicService createBasicService()
{
return (BasicService) createService("javax.jnlp.BasicService");
}
private FileSaveService createFileSaveService()
{
return (FileSaveService) createService("javax.jnlp.FileSaveService");
}
private FileOpenService createFileOpenService()
{
return (FileOpenService) createService("javax.jnlp.FileOpenService");
}
private PersistenceService createPersistenceService()
{
return (PersistenceService) createService("javax.jnlp.PersistenceService");
}
private DownloadService createDownloadService()
{
return (DownloadService) createService("javax.jnlp.DownloadService");
}
private ClipboardService createClipboardService()
{
return (ClipboardService) createService("javax.jnlp.ClipboardService");
}
/**
* Creates a new PageFormat instance and sets it to the default size and orientation.
*/
public PageFormat getDefaultPage()
{
if (printService == null) printService = createPrintService();
return printService.getDefaultPage();
}
/**
* Prints a document using the given Pageable object
*/
public boolean print(Pageable document)
{
if (printService == null) printService = createPrintService();
return printService.print(document);
}
/**
* Prints a document using the given Printable object.
*/
public boolean print(Printable painter)
{
if (printService == null) printService = createPrintService();
return printService.print(painter);
}
/**
* Displays a dialog that allows modification of a PageFormat instance.
*/
public PageFormat showPageFormatDialog(PageFormat page)
{
if (printService == null) printService = createPrintService();
return printService.showPageFormatDialog(page);
}
public void loadUserPreferences(Properties props)
{
if (basicService == null) basicService = createBasicService();
if (persistenceService == null) persistenceService = createPersistenceService();
try
{
URL codebase = basicService.getCodeBase();
URL fileURL = new URL(codebase,app.getAppName());
FileContents file = persistenceService.get(fileURL);
InputStream in = new BufferedInputStream(file.getInputStream());
try
{
props.load(in);
}
finally
{
in.close();
}
}
catch (Exception x)
{
}
}
public void storeUserPreferences(Properties props)
{
if (basicService == null) basicService = createBasicService();
if (persistenceService == null) persistenceService = createPersistenceService();
try
{
URL codebase = basicService.getCodeBase();
URL fileURL = new URL(codebase,app.getAppName());
OutputStream out;
try
{
FileContents file = persistenceService.get(fileURL);
out = new BufferedOutputStream(file.getOutputStream(true));
}
catch (FileNotFoundException x)
{
long size = persistenceService.create(fileURL,10000);
FileContents file = persistenceService.get(fileURL);
out = new BufferedOutputStream(file.getOutputStream(false));
}
try
{
props.store(out,app.getAppName()+" User Properties");
}
finally
{
out.close();
}
}
catch (Exception x)
{
}
}
public FileAccess openFileDialog(FileFilter[] filters, FileFilter defaultFilter, String key)
{
if (basicService == null) basicService = createBasicService();
if (fileOpenService == null) fileOpenService = createFileOpenService();
try
{
FileContents fc = fileOpenService.openFileDialog(null,null);
if (fc == null) return null;
return new JNLPFileAccess(fc);
}
catch (IOException x)
{
return null;
}
}
public FileAccess saveFileAsDialog(FileFilter[] filters, FileFilter defaultFilter, String key, InputStream in)
{
if (basicService == null) basicService = createBasicService();
if (fileSaveService == null) fileSaveService = createFileSaveService();
try
{
FileContents fc = fileSaveService.saveFileDialog(null,new String[]{ "gif" },in,"xxx.gif");
if (fc == null) return null;
return new JNLPFileAccess(fc);
}
catch (IOException x)
{
x.printStackTrace();
return null;
}
}
public boolean isAvailable(String part)
{
if (basicService == null) basicService = createBasicService();
if (downloadService == null) downloadService = createDownloadService();
return downloadService.isPartCached(part);
}
public boolean makeAvailable(final String part)
{
return makeAvailable(part,"Loading "+part);
}
public boolean makeAvailable(final String part, final String message)
{
if (isAvailable(part)) return true;
try
{
// note, in JAWS 1.0 there appears to be a (bug?) such that loadPart()
// fails if used with the defaultProgressWindow from the event dispatch thread.
// Maybe this will be fixed in future, but for now we use our own implementation
// of the progress window.
if (SwingUtilities.isEventDispatchThread())
{
final ProgressDialog progress = new ProgressDialog(message);
final JDialog dlg = progress.createDialog(Application.getApplication(),"Downloading...");
final Thread t = new Thread()
{
public void run()
{
try
{
downloadService.loadPart(part,progress);
}
catch (IOException x)
{
progress.setFailed();
}
finally
{
dlg.dispose();
}
}
};
t.start();
dlg.setVisible(true);
return progress.isDone();
}
else
{
downloadService.loadPart(part,downloadService.getDefaultProgressWindow());
return true;
}
}
catch (Exception x)
{
x.printStackTrace();
return false;
}
}
public Transferable getClipboardContents()
{
if (clipboardService == null) clipboardService = createClipboardService();
return clipboardService.getContents();
}
public void setClipboardContents(Transferable contents)
{
if (clipboardService == null) clipboardService = createClipboardService();
clipboardService.setContents(contents);
}
}
class ProgressDialog extends JOptionPane implements DownloadServiceListener, Runnable, ActionListener
{
private JProgressBar progress = new JProgressBar(0,100);
private JLabel statusLabel = new JLabel("Status");
private int pc = 0;
private String status;
private boolean failed = false;
private boolean abort = false;
private JButton cancel = new JButton("Cancel");
ProgressDialog(String message)
{
super();
JPanel messagePane = new JPanel(new BorderLayout());
messagePane.add(new JLabel(message),BorderLayout.NORTH);
messagePane.add(progress);
messagePane.add(statusLabel,BorderLayout.SOUTH);
cancel.addActionListener(this);
setMessage(messagePane);
setMessageType(INFORMATION_MESSAGE);
setOptions(new Object[]{ cancel });
}
public void downloadFailed(java.net.URL url, java.lang.String version)
{
failed = true;
}
public void progress(java.net.URL url, java.lang.String version, long readSoFar, long total, int overallPercent)
{
if (abort) throw new RuntimeException("Download aborted");
pc = overallPercent;
status = "Downloading "+readSoFar;
SwingUtilities.invokeLater(this);
}
public void upgradingArchive(java.net.URL url, java.lang.String version, int patchPercent, int overallPercent)
{
if (abort) throw new RuntimeException("Download aborted");
pc = overallPercent;
status = "Upgrading "+patchPercent+"%";
SwingUtilities.invokeLater(this);
}
public void validating(java.net.URL url, java.lang.String version, long entry, long total, int overallPercent)
{
if (abort) throw new RuntimeException("Download aborted");
pc = overallPercent;
status = "Validating "+entry+"/"+total;
SwingUtilities.invokeLater(this);
}
public void run()
{
progress.setValue(pc);
statusLabel.setText(status);
}
void setFailed()
{
failed = true;
}
boolean isDone()
{
return !failed && !abort;
}
public void actionPerformed(ActionEvent e)
{
abort = true;
}
}