| import gov.noaa.ncdc.publications.exception.ConvertException; |
| import gov.noaa.ncdc.publications.exception.CreatePDFFileException; |
| import gov.noaa.ncdc.publications.exception.CreateTempWorkingDirException; |
| import gov.noaa.ncdc.publications.exception.FTPServerException; |
| import gov.noaa.ncdc.publications.exception.FTPServerTimeoutException; |
| import gov.noaa.ncdc.publications.exception.createListFileException; |
| import gov.noaa.ncdc.util.FileUtils; |
| import gov.noaa.ncdc.util.Registry; |
| import gov.noaa.ncdc.util.WssrdFileComparator; |
| import gov.noaa.ncdc.util.ftpServer.FtpServer; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import java.io.BufferedWriter; |
| import java.io.File; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.PrintWriter; |
| |
| import java.util.Arrays; |
| |
| |
| /** |
| * <p> |
| * <CODE>RemotePublication</CODE> RemotePublication is a publication |
| * stored as TIF files in the WSSRD database. |
| * </p> |
| * <pre> |
| * Revision 1.1 2003/10/15 13:11:18 othomann |
| * Fix for 44839 |
| * |
| * Revision 1.6 2003/10/09 22:07:28 jduska |
| * Merged Chaged from 1.3 Branch into Head |
| * |
| * Revision 1.5.2.2 2003/10/01 22:48:03 jduska |
| * Added support, so that the publication can be retrieved by WSSRD cabinet |
| * and WSSRD docID |
| * |
| * Revision 1.5.2.1 2003/09/17 18:20:48 jduska |
| * Change FTP Errors to Warnings |
| * |
| * Revision 1.5 2003/07/25 20:49:52 jduska |
| * - Updated the Publication Library to use a new renameFile method |
| * - Created the new FileUtils class by moving the copyFile and adding the renameFile |
| * methods |
| * |
| * Revision 1.4 2003/07/17 23:56:58 jduska |
| * - Updated to support new support files in the command line tool |
| * - Update the properties to support the dynamic changing the FTP library |
| * - Cleaned up the exceptions and few other files with outdate or unneed imports and etc |
| * |
| * Revision 1.3 2003/07/07 15:42:48 jduska |
| * - Corrected bugs in new changes to support the Publication Library |
| * |
| * Revision 1.2 2003/07/02 17:33:14 jduska |
| * - bug fix to correct the Temporary Directory |
| * issue when using the library within a web application |
| * |
| * Revision 1.1 2003/06/26 23:54:10 jduska |
| * - Command Line version of the Publication Library |
| * |
| * Revision 1.3 2003/06/26 23:43:21 jduska |
| * - Changes to support using the PDF Library on the command line |
| * |
| * Revision 1.1 2003/06/09 21:27:29 jduska |
| * - Updated the library, so works on Windows |
| * |
| * Revision 1.1 2003/01/24 18:43:58 jduska |
| * More refactoring of the SerialPublications to |
| * support the local documents |
| * |
| * Revision 1.3 2002/10/11 21:03:50 jduska |
| * keyword substitution change *** |
| * |
| * </pre> |
| */ |
| public class RemotePublication extends Publication { |
| private static final String PDF_FILETYPE = "PDF"; |
| private static Log log = |
| LogFactory.getLog(RemotePublication.class.getName()); |
| private String _fileList; |
| private String _fileType; |
| protected String _pages[]; |
| |
| protected RemotePublication(String id, String year, String month, |
| String stateCode, |
| String serverDirectory, String cabinet) { |
| super(id, year, month, stateCode, serverDirectory, cabinet); |
| _fileList = _cabinet + '~' + id + ".txt"; |
| } |
| |
| public boolean getDocument() { |
| int attempt = 0; |
| |
| while (attempt < _maxAttempts) { |
| try { |
| attempt++; |
| log.info("*** Downloading " + _localFilename + |
| EXTENTION + " attempt " + attempt + |
| " out of " + _maxAttempts); |
| |
| if (getRemoteDocument()) { |
| log.info("Success document published " + |
| _localFilename + EXTENTION); |
| |
| return true; |
| } |
| } catch (ConvertException e) { |
| |
| log.warn(e); |
| } |
| } |
| |
| return false; |
| } |
| |
| protected boolean getRemoteDocument() throws ConvertException { |
| boolean successful = false; |
| |
| try { |
| createTempWorkingDir(); |
| getPages(); |
| |
| if (_fileType != PDF_FILETYPE) { |
| createListFile(); |
| createPDFFile(); |
| } else { |
| renamePDFFile(); |
| } |
| |
| successful = true; |
| } catch (FTPServerTimeoutException e) { |
| String msg = |
| "Convert process timed out retriving TIFF page" + |
| e.getFileName(); |
| log.warn(msg); |
| throw new ConvertException(msg); |
| } catch (FTPServerException e) { |
| String msg = |
| "Convert process encounter an " + e.getMessage(); |
| log.warn(msg); |
| throw new ConvertException(msg); |
| } catch (CreateTempWorkingDirException e) { |
| String msg = |
| "Error: Covert could not create a Working Directory!"; |
| log.warn(msg); |
| throw new ConvertException(msg); |
| } catch (CreatePDFFileException e) { |
| String msg = |
| "Could not create the PDF file " + e.getMessage(); |
| log.warn(msg); |
| throw new ConvertException(msg); |
| } catch (createListFileException e) { |
| String msg = |
| "Could not create the c42pdf List File" + |
| e.getMessage(); |
| throw new ConvertException(msg); |
| } catch (NoFTPServiceException e) { |
| String msg = |
| "Could not create the FTP Service " + e.getMessage(); |
| log.warn(msg); |
| throw new ConvertException(msg); |
| } |
| |
| return successful; |
| } |
| |
| protected void getPages() |
| throws FTPServerTimeoutException, |
| FTPServerException, NoFTPServiceException { |
| // Setup the ftp server |
| FtpServer ftp; |
| |
| try { |
| ftp = (FtpServer) Class.forName(Registry.getFTPService()) |
| .newInstance(); |
| ftp.setServer(Registry.getUrl()); |
| ftp.setPassword(Registry.getFtpPassword()); |
| ftp.setUserName(Registry.getFtpUserName()); |
| ftp.setPassive(Registry.usePassive()); |
| ftp.setTimeout(Registry.getFtpTimeout()); |
| |
| // get the pages and store them in the _workingDir |
| _pages = |
| ftp.getFiles(getWssrdDocumentName(), _workingDir); |
| |
| if ((_pages.length == 1) && _pages[0].endsWith(".PDF")) { |
| _fileType = PDF_FILETYPE; |
| } |
| } catch (InstantiationException e) { |
| log.warn(e.getMessage()); |
| throw new NoFTPServiceException(); |
| } catch (IllegalAccessException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (ClassNotFoundException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| |
| protected void createPDFFile() throws CreatePDFFileException { |
| String cmdLine = null; |
| |
| try { |
| File newPdfFile = |
| new File(_workingDir + File.separator + |
| _localFilename + EXTENTION); |
| |
| if (Registry.isCommandLineMode()) { |
| handleMultipleDocuments(newPdfFile); |
| } |
| |
| cmdLine = createC42PDFCommandLine(newPdfFile.getName()); |
| |
| if (log.isDebugEnabled()) { |
| log.debug("Running " + cmdLine); |
| } |
| |
| // run C42PDF to create the file & wait till it finishes. |
| Process p = Runtime.getRuntime().exec(cmdLine); |
| p.waitFor(); |
| |
| // check to see if it worked |
| if (!newPdfFile.exists()) { |
| log.warn("PDF File was not created!"); |
| throw new CreatePDFFileException("PDF File was not created!"); |
| } |
| } catch (IOException e) { |
| e.printStackTrace(); |
| throw new CreatePDFFileException(e.toString()); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| throw new CreatePDFFileException(e.toString()); |
| } |
| |
| return; |
| } |
| |
| /** |
| * generates the command line need to execute the C42PDF tool in |
| * a shell. This requires that the |
| * <code>Registry.getConvertToolPath()</code> and |
| * <code>Registry.getConvertToolName()</code> are valid. |
| * |
| * @param documentName the name of the document you wish to |
| * create |
| * |
| * @return |
| */ |
| private String createC42PDFCommandLine(String documentName) { |
| return (Registry.getConvertToolPath() + File.separator + |
| Registry.getConvertToolName() + |
| (" -o " + _workingDir + File.separator + documentName + |
| " -l " + _workingDir + File.separator + _fileList)); |
| } |
| |
| /** |
| * there a special cases within WSSRD where there may be more |
| * than one PDF that makes up the document. For example River |
| * Basin documents. Thus, it is possible for the same document |
| * already exist when using this libarary via a command line |
| * mode. <code>handleMultipleDocuments</code> will add a index |
| * counter to end of each duplicate filename. Thus, if there are |
| * three files for this document the files would be name |
| * filename1, filename2 and filename3 |
| * |
| * @param newPdfFile name of the document we are making sure does |
| * already exist |
| */ |
| private void handleMultipleDocuments(File newPdfFile) { |
| int documentCount = 0; |
| String newFilename; |
| |
| if (log.isDebugEnabled()) { |
| log.debug("Checking to see if " + newPdfFile.getName() + |
| "already exists"); |
| } |
| |
| while (newPdfFile.exists()) { |
| documentCount++; |
| newFilename = |
| (new StringBuffer(_workingDir).append(File.separator) |
| .append(_localFilename) |
| .append(documentCount) |
| .append(EXTENTION)).toString(); |
| |
| if (log.isDebugEnabled()) { |
| log.debug("File already exists. Check to see if we need rename existing file"); |
| } |
| |
| if (documentCount == 1) { |
| File backupPdfFile = new File(newFilename); |
| newPdfFile.renameTo(backupPdfFile); |
| } |
| |
| newPdfFile = new File(newFilename); |
| } |
| |
| return; |
| } |
| |
| protected void createListFile() throws createListFileException { |
| PrintWriter tiffFileListFile = null; |
| |
| String s; |
| |
| // Must have pages to sort! |
| if (_pages.length == 0) { |
| log.error("Internal Error: _tiffPage == null!"); |
| throw new createListFileException("No pages found in the document!"); |
| } |
| |
| // Sort TIFF files into the correct page order |
| WssrdFileComparator fileComparator = |
| new WssrdFileComparator(); |
| Arrays.sort(_pages, fileComparator); |
| |
| if (log.isDebugEnabled()) { |
| log.debug("Creating list file for C42PDF"); |
| } |
| |
| try { |
| File tiffFileList = |
| new File(_workingDir + File.separator + _fileList); |
| |
| if (tiffFileList.exists()) { |
| tiffFileList.delete(); |
| } |
| |
| tiffFileListFile = |
| new PrintWriter(new BufferedWriter(new FileWriter(_workingDir + |
| File.separator + |
| _fileList))); |
| |
| for (int i = 0; i < _pages.length; i++) { |
| s = _workingDir + File.separator + _pages[i]; |
| |
| if (log.isDebugEnabled()) { |
| log.debug(s); |
| } |
| |
| tiffFileListFile.println(s); |
| } |
| } catch (IOException e) { |
| e.printStackTrace(); |
| throw new createListFileException(e.toString()); |
| } finally { |
| if (tiffFileListFile != null) { |
| tiffFileListFile.close(); |
| } |
| |
| if (log.isDebugEnabled()) { |
| log.debug("Finished Creating list file for C42PDF"); |
| } |
| |
| return; |
| } |
| } |
| |
| protected void renamePDFFile() throws CreatePDFFileException { |
| String newFileName = |
| _workingDir + File.separator + _localFilename + |
| EXTENTION; |
| String oldWssrdFile = |
| _workingDir + File.separator + _pages[0]; |
| |
| try { |
| FileUtils.renameFile(oldWssrdFile, newFileName); |
| } catch (IOException e) { |
| |
| String msg = "The following error occurred " + e.getMessage(); |
| log.warn(msg); |
| throw new CreatePDFFileException("Could not rename PDF File"); |
| } |
| |
| |
| } |
| } |