From: <pat...@us...> - 2011-03-07 19:35:53
|
Revision: 1238 http://cishell.svn.sourceforge.net/cishell/?rev=1238&view=rev Author: pataphil Date: 2011-03-07 19:35:47 +0000 (Mon, 07 Mar 2011) Log Message: ----------- * Trying to clean up the File IO Services, but there are still some issues. See the wiki. Modified Paths: -------------- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/save/Save.java trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/AbstractFileSaverService.java trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/FileSaverService.java trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/FileSaverServiceImpl.java trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/SaveAsController.java Modified: trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/save/Save.java =================================================================== --- trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/save/Save.java 2011-03-07 19:35:10 UTC (rev 1237) +++ trunk/clients/gui/org.cishell.reference.gui.persistence/src/org/cishell/reference/gui/persistence/save/Save.java 2011-03-07 19:35:47 UTC (rev 1238) @@ -8,7 +8,6 @@ import org.cishell.framework.algorithm.AlgorithmCanceledException; import org.cishell.framework.algorithm.AlgorithmExecutionException; import org.cishell.framework.data.Data; -import org.cishell.service.conversion.Converter; import org.osgi.service.log.LogService; public class Save implements Algorithm { @@ -37,30 +36,31 @@ private void tryToSave(final Data outData, String outFormat) throws AlgorithmExecutionException { try { - Converter userChosenConverter = - this.fileSaver.promptForConverter(outData, outFormat); - - if (userChosenConverter == null) { + File outputFile = this.fileSaver.saveData(outData); +// Converter userChosenConverter = +// this.fileSaver.promptForConverter(outData, outFormat); +// +// if (userChosenConverter == null) { +// throw new AlgorithmCanceledException( +// "User canceled file saving when choosing what kind of file to save as."); +// } +// +// File userChosenFile = this.fileSaver.promptForTargetFile(outData); +// + if (outputFile == null) { throw new AlgorithmCanceledException( - "User canceled file saving when choosing what kind of file to save as."); - } - - File userChosenFile = this.fileSaver.promptForTargetFile(outData); - - if (userChosenFile == null) { - throw new AlgorithmCanceledException( "User canceled file saving when choosing the destination of the file."); } +// +// Data outputDatum = +// this.fileSaver.save(userChosenConverter, outData, userChosenFile); +// +// // TODO: Should we bother handling this? sure, why not. maybe algexec would be appropriate +// if (outputDatum == null) { +// return; +// } - Data outputDatum = - this.fileSaver.save(userChosenConverter, outData, userChosenFile); - - // TODO: Should we bother handling this? sure, why not. maybe algexec would be appropriate - if (outputDatum == null) { - return; - } - - String logMessage = String.format("Saved: %s", userChosenFile.getPath()); + String logMessage = String.format("Saved: %s", outputFile.getPath()); this.logger.log(LogService.LOG_INFO, logMessage); } catch (FileSaveException e) { String logMessage = String.format( Modified: trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/AbstractFileSaverService.java =================================================================== --- trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/AbstractFileSaverService.java 2011-03-07 19:35:10 UTC (rev 1237) +++ trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/AbstractFileSaverService.java 2011-03-07 19:35:47 UTC (rev 1238) @@ -7,6 +7,7 @@ import java.util.Dictionary; import java.util.HashSet; +import org.cishell.framework.algorithm.AlgorithmProperty; import org.cishell.framework.data.Data; import org.cishell.framework.data.DataProperty; import org.cishell.service.conversion.ConversionException; @@ -26,6 +27,8 @@ new Character('|'), new Character('%')))); public static final char FILENAME_CHARACTER_REPLACEMENT = '#'; + public static final String FILE_EXTENSION_PREFIX = "file-ext:"; + public static final String FILE_PREFIX = "file:"; private Collection<FileSaveListener> listeners; @@ -41,68 +44,77 @@ return promptForTargetFile(""); } - public File promptForTargetFile(Data datum) throws FileSaveException { + public File promptForTargetFile(String defaultFileExtension) throws FileSaveException { + return promptForTargetFile("", defaultFileExtension); + } + + public File promptForTargetFile( + Data datum, String defaultFileExtension) throws FileSaveException { Object dataObject = datum.getData(); if (dataObject instanceof File) { - return promptForTargetFile((File) datum.getData()); + String fileName = ((File) datum.getData()).getName(); + return promptForTargetFile(fileName, defaultFileExtension); } else { - return promptForTargetFile(suggestFileName(datum)); + return promptForTargetFile(suggestFileName(datum), defaultFileExtension); } } public File promptForTargetFile(File outputFile) throws FileSaveException { - return promptForTargetFile(outputFile.getName()); + return promptForTargetFile(outputFile.getName(), ""); } - public File save(Data sourceDatum) throws FileSaveException { - return save((File) sourceDatum.getData()); + public File saveData(Data sourceDatum) throws FileSaveException { + return saveData(sourceDatum, ANY_FILE_EXTENSION); } - public File save(File sourceFile) throws FileSaveException { - File targetFile = promptForTargetFile(sourceFile); - saveTo(sourceFile, targetFile); - - return targetFile; - } - - public Data save(Data sourceDatum, String targetMimeType) + public File saveData(Data sourceDatum, String targetMimeType) throws FileSaveException { Converter converter = promptForConverter(sourceDatum, targetMimeType); if (converter != null) { - return save(converter, sourceDatum); + return saveData(sourceDatum, converter); } else { // TODO: CanceledException? return null; } } - // TODO: What to actually return here? Maybe Pair<Data, File> (LOL)? - public Data save(Converter converter, Data sourceDatum) - throws FileSaveException { - File targetFile = promptForTargetFile(sourceDatum); + public File saveData(Data sourceDatum, Converter converter) throws FileSaveException { + String outputMimeType = + converter.getProperties().get(AlgorithmProperty.OUT_DATA).toString(); + System.err.println("outputMimeType: " + outputMimeType); + String suggestedFileExtension = suggestFileExtension(outputMimeType); + System.err.println("suggestedFileExtension: " + suggestedFileExtension); + File targetFile = promptForTargetFile(sourceDatum, suggestedFileExtension); if (targetFile != null) { - return save(converter, sourceDatum, targetFile); + return saveData(sourceDatum, converter, targetFile); } else { // TODO: CanceledException? return null; } } - public Data save( - Converter converter, Data sourceDatum, File targetFile) throws FileSaveException { + public File saveData(Data sourceDatum, Converter converter, File targetFile) + throws FileSaveException { try { Data convertedDatum = converter.convert(sourceDatum); saveTo((File) convertedDatum.getData(), targetFile); - return convertedDatum; + return targetFile; } catch (ConversionException e) { throw new FileSaveException(e.getMessage(), e); } } + public File save(File sourceFile) throws FileSaveException { + File targetFile = promptForTargetFile(sourceFile); + saveTo(sourceFile, targetFile); + + return targetFile; + } + public String suggestFileName(Data datum) { return replaceInvalidFilenameCharacters(getLabel(datum)); } @@ -134,4 +146,26 @@ return cleanedFilename; } + + private static String suggestFileExtension(String targetMimeType) { + if (targetMimeType.startsWith(FILE_EXTENSION_PREFIX)) { + return targetMimeType.substring(FILE_EXTENSION_PREFIX.length()); + } else if (targetMimeType.startsWith(FILE_PREFIX)) { + int forwardSlashCharacterIndex = targetMimeType.indexOf('/'); + + if (forwardSlashCharacterIndex != -1) { + int parsedOutFileExtensionStart = (forwardSlashCharacterIndex + 1); + + if (parsedOutFileExtensionStart < targetMimeType.length()) { + return targetMimeType.substring(parsedOutFileExtensionStart); + } else { + return ""; + } + } else { + return ""; + } + } else { + return targetMimeType; + } + } } \ No newline at end of file Modified: trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/FileSaverService.java =================================================================== --- trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/FileSaverService.java 2011-03-07 19:35:10 UTC (rev 1237) +++ trunk/core/org.cishell.framework/src/org/cishell/app/service/filesaver/FileSaverService.java 2011-03-07 19:35:47 UTC (rev 1238) @@ -19,26 +19,21 @@ throws FileSaveException; public File promptForTargetFile() throws FileSaveException; - public File promptForTargetFile(Data datum) throws FileSaveException; + public File promptForTargetFile(String defaultFileExtension) throws FileSaveException; + public File promptForTargetFile( + Data datum, String defaultFileExtension) throws FileSaveException; public File promptForTargetFile(File outputFile) throws FileSaveException; - public File promptForTargetFile(String fileName) throws FileSaveException; + public File promptForTargetFile( + String suggestedFileName, String defaultFileExtension) throws FileSaveException; - /* TODO I'm seriously tempted to recommend that all methods beyond this point be called - * "save" or "saveToFile" or something, and just have a bit of very concise Javadoc that - * explains what may be prompted for? Alternatively, ask another dev about doing the null - * arguments idea. - */ - // TODO (NEW): Just Javadoc these really well? - public File save(Data sourceDatum) throws FileSaveException; + public File saveData(Data sourceDatum) throws FileSaveException; + public File saveData(Data sourceDatum, String targetMimeType) throws FileSaveException; + public File saveData(Data sourceDatum, Converter converter) throws FileSaveException; + public File saveData( + Data sourceDatum, Converter converter, File targetFile) throws FileSaveException; + public File save(File sourceFile) throws FileSaveException; public void saveTo(File sourceFile, File targetFile) throws FileSaveException; - // TODO: What to actually return here? the File object for the one on disk - /* TODO sourceDatum always first, targetType/File last */ - public Data save(Data sourceDatum, String targetMimeType) throws FileSaveException; - public Data save(Converter converter, Data sourceDatum) throws FileSaveException; - public Data save( - Converter converter, Data sourceDatum, File targetFile) throws FileSaveException; - public String suggestFileName(Data datum); } \ No newline at end of file Modified: trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/FileSaverServiceImpl.java =================================================================== --- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/FileSaverServiceImpl.java 2011-03-07 19:35:10 UTC (rev 1237) +++ trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/FileSaverServiceImpl.java 2011-03-07 19:35:47 UTC (rev 1238) @@ -75,7 +75,9 @@ } } - public File promptForTargetFile(final String fileName) throws FileSaveException { + public File promptForTargetFile( + final String suggestedFileName, + final String defaultFileExtension) throws FileSaveException { final File[] resultFile = new File[1]; try { @@ -84,7 +86,7 @@ SaveAsController saveAs = new SaveAsController(FileSaverServiceImpl.this.guiBuilder); - resultFile[0] = saveAs.open(fileName); + resultFile[0] = saveAs.open(suggestedFileName, defaultFileExtension); } }); Modified: trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/SaveAsController.java =================================================================== --- trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/SaveAsController.java 2011-03-07 19:35:10 UTC (rev 1237) +++ trunk/core/org.cishell.reference/src/org/cishell/reference/app/service/filesaver/SaveAsController.java 2011-03-07 19:35:47 UTC (rev 1238) @@ -27,13 +27,8 @@ this.guiBuilder = guiBuilder; } - public File open(String fileName) { - String fileExtension = getFileExtension(fileName); - - return open(fileName, fileExtension); - } - - public File open(String suggestedFileName, String fileExtension) { + public File open(String suggestedFileName, String suggestedFileExtension) { + String fileExtension = determineFileExtension(suggestedFileName, suggestedFileExtension); Shell parentShell = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getShell(); FileDialog dialog = new FileDialog(parentShell, SWT.SAVE); @@ -45,6 +40,8 @@ dialog.setFilterPath(currentDirectory.getPath()); if ((fileExtension != null) && !"*".equals(fileExtension) && !"".equals(fileExtension)) { + String isolatedFileName = stripFileExtension(suggestedFileName); + suggestedFileName = String.format("%s.%s", suggestedFileName, suggestedFileExtension); dialog.setFilterExtensions(new String[] { String.format("*.%s", fileExtension) }); } @@ -70,6 +67,30 @@ } } + private String determineFileExtension( + String suggestedFileName, String suggestedFileExtension) { + if ((suggestedFileExtension != null) && !"".equals(suggestedFileExtension)) { + return suggestedFileExtension; + } else { + String fileExtension = getFileExtension(suggestedFileName); + + if (!"".equals(fileExtension)) { + return fileExtension; + } else { + return ""; + } + } +// if (!"".equals(fileExtension)) { +// return fileExtension; +// } else { +// if (defaultFileExtension != null) { +// return defaultFileExtension; +// } else { +// return ""; +// } +// } + } + private boolean confirmFileOverwrite(File file) { String message = "The file:\n" + file.getPath() + "\nalready exists. Are you sure you want to overwrite it?"; @@ -112,4 +133,15 @@ return cleanedFilename; } + + // TODO: Use cns-utilities when that's done. + private static String stripFileExtension(String filePath) { + int periodPosition = filePath.lastIndexOf("."); + + if ((periodPosition != -1) && ((periodPosition + 1) < filePath.length())) { + return filePath.substring(0, periodPosition); + } else { + return filePath; + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |