/*
Violet - A program for editing UML diagrams.
Copyright (C) 2007 Cay S. Horstmann (http://horstmann.com)
Alexandre de Pellegrin (http://alexdp.free.fr);
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.horstmann.violet.framework.file.chooser;
import java.io.IOException;
import java.util.ArrayList;
import javax.jnlp.FileContents;
import javax.jnlp.FileOpenService;
import javax.jnlp.FileSaveService;
import javax.jnlp.ServiceManager;
import javax.jnlp.UnavailableServiceException;
import com.horstmann.violet.framework.file.IFile;
import com.horstmann.violet.framework.file.naming.ExtensionFilter;
import com.horstmann.violet.framework.file.naming.FileNamingService;
import com.horstmann.violet.framework.file.persistence.IFileReader;
import com.horstmann.violet.framework.file.persistence.IFileWriter;
import com.horstmann.violet.framework.file.persistence.JNLPFileReader;
import com.horstmann.violet.framework.file.persistence.JNLPFileWriter;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.BeanInjector;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.InjectedBean;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.ManagedBean;
/**
* This class provides a FileService for Java Web Start. Note that file saving is strange under Web Start. You first save the data,
* and the dialog is only displayed when the output stream is closed. Therefore, the file name is not available until after the file
* has been written.
*/
@ManagedBean(registeredManually=true)
public class JNLPFileChooserService implements IFileChooserService
{
/**
* Default constructor
*
* @param namingService
*/
public JNLPFileChooserService()
{
BeanInjector.getInjector().inject(this);
try
{
openService = (FileOpenService) ServiceManager.lookup("javax.jnlp.FileOpenService");
saveService = (FileSaveService) ServiceManager.lookup("javax.jnlp.FileSaveService");
}
catch (UnavailableServiceException ex)
{
ex.printStackTrace();
}
}
/*
* (non-Javadoc)
*
* @see com.horstmann.violet.framework.file.chooser.IFileChooserService#isWebStart()
*/
public boolean isWebStart()
{
return true;
}
@Override
public IFileReader getFileReader(IFile file) throws IOException
{
String currentDirectory = file.getDirectory();
String filename = file.getFilename();
ExtensionFilter[] filters = this.fileNamingService.getFileFilters();
ArrayList<String> fileExtensions = new ArrayList<String>();
for (ExtensionFilter aFilter : filters)
{
String aFilterExtension = aFilter.getExtension();
if (filename.endsWith(aFilterExtension)) {
fileExtensions.add(aFilterExtension);
}
}
String[] fileExtensionsStrings = (String[]) fileExtensions.toArray(new String[fileExtensions.size()]);
final FileContents contents = openService.openFileDialog(currentDirectory, fileExtensionsStrings);
return new JNLPFileReader(contents);
}
@Override
public IFileReader chooseAndGetFileReader(ExtensionFilter... filters) throws IOException
{
String currentDirectory = ".";
ArrayList<String> fileExtensions = new ArrayList<String>();
//ExtensionFilter[] filters = this.fileNamingService.getFileFilters();
for (int i = 0; i < filters.length; i++)
{
ExtensionFilter aFilter = filters[i];
String filterExtension = aFilter.getExtension();
fileExtensions.add(filterExtension);
}
String[] fileExtensionsStrings = (String[]) fileExtensions.toArray(new String[fileExtensions.size()]);
final FileContents contents = openService.openFileDialog(currentDirectory, fileExtensionsStrings);
return new JNLPFileReader(contents);
}
@Override
public IFileWriter getFileWriter(IFile file) throws IOException
{
String defaultDirectory = file.getDirectory();
ArrayList<String> fileExtensions = new ArrayList<String>();
ExtensionFilter[] filters = this.fileNamingService.getFileFilters();
for (int i = 0; i < filters.length; i++)
{
ExtensionFilter aFilter = filters[i];
String filterExtension = aFilter.getExtension();
fileExtensions.add(filterExtension);
}
String[] fileExtensionsStrings = (String[]) fileExtensions.toArray(new String[fileExtensions.size()]);
FileContents contents = saveService.saveAsFileDialog(defaultDirectory, fileExtensionsStrings, null);
if (contents == null)
{
return null;
}
return new JNLPFileWriter(contents);
}
@Override
public IFileWriter chooseAndGetFileWriter(final ExtensionFilter... filters) throws IOException
{
String defaultDirectory = ".";
ArrayList<String> fileExtensions = new ArrayList<String>();
for (int i = 0; i < filters.length; i++)
{
ExtensionFilter aFilter = filters[i];
String filterExtension = aFilter.getExtension();
fileExtensions.add(filterExtension);
}
String[] fileExtensionsStrings = (String[]) fileExtensions.toArray(new String[fileExtensions.size()]);
FileContents contents = saveService.saveAsFileDialog(defaultDirectory, fileExtensionsStrings, null);
if (contents == null)
{
return null;
}
return new JNLPFileWriter(contents);
}
/**
* JNLP service
*/
private FileOpenService openService;
/**
* JNLP service
*/
private FileSaveService saveService;
/**
* Handle file names
*/
@InjectedBean
private FileNamingService fileNamingService;
}